MySQL update na podstawie tab. relacji

0

mam 3 tabele: tblPodstawowa, tblRelacja, tblDane. Chcę teraz z tblPodstawowa wrzucic dane do tblDane pod warunkiem że w tblRelacja jest odpowiednia wartosc np:
tblPodstawa są wartosci 1,2,3,4,5
tblRelkacja jest 3
to chciałbym zeby do tblDane przenioslo mi tylko rekord zawierający 3.
Probowałem to tak:

UPDATE tblDane
SET tblDane.wartosc=tblPodstawa.wartosc
WHERE tblPodstawa.ID= (SELECT ID from tblRelacja)

0

troche jasko niejasno to przedstawiles bo ok rozumiem tabela podstawa zawiera jakies tam wartosci tabela relacja rowniez ale skoro mowisz ze warunkiem sa posiadane wartosci po co na ID operujesz? moze lepij podaj budowe tych tabel czyli z jakich kolumn sie skladaja z tego co widze na pewno ID, wartosc w podstawa i relacja w Dane nie wiem czy ID wystepuje... ale wedlug powyzszego powinno zapytanie tak wygladac:

UPDATE tblDane,
SET tblDane.wartosc=(SELECT tblPodstawa.wartosc FROM tblPodstawa, tblRelacja WHERE tblPodstawa.wartosc=tblRelacja.wartosc);

tylko to zapytanie zaktualizuje wszystkie wiersze w tabeli tblDane na wartosc z tabeli Podstawa wiec tutaj jest pewna niejasnosc ktora wyjasni jak Twoje tabele dokladnie wygladaja i wtedy mozna mowic wiecej

0

sorry ze tak niejasno wyjasniłem ale spieszyłem się.
Struktura wygląda tak:
tblPodstawa: id, dana1, dana2
tblDane: id,dana1, dana2...
tblRelacja: dana1,danaX
Chodzi o to że w tblPodstawa jest całe mnóstwo rekordów, do tblDane chce przeniesc tylko te które spełniają określony warunek, a mianowicie znajdują się w tblRelacja w kolumnie Dana1. Z tego co widzę to chyba napisałeś to o ci mi chodziło. Jutro sprawdzę. Dzięki

0

hmm mysle ze wtedy zle zinterpretowalem Twoja wypowiedz teraz mysle chociaz nadal mam pewne watpliwosci bo nie wiem czy tblDane cos zawiera ale z mojego punktu widzenia jesli maja byc przenoszone wszystjie te wartosci musza byc przenoszone do konkretnych wierszy w tblDane wiec chopdzi tutaj chyba o zgosdnosc ID w tblDane i tblPodstawa zapytanie raczej powinno wygladac tak:

UPDATE tblDane, tblPodstawa, btlRelacje SET tblDane.dane1=tblPodstawa.dane1 WHERE tblPodstawa.id=tblDane.id and tblPodstawa.dane1=tblRelacje.dane1;

to zaptytanie bedzie przenosilo wszystkie te wartosci z tabeli tblPodstawa o wartosciach kolumny dane1 rownych wartosci kolumn dane1 z tabeli tblRelacje do wierszy tabeli tblDane o ID rownych ID wierszy tabeli tblPodstawa tylko teraz to ma dla mnie jakis sens ale nadal nie wiem dokladnie jak to ma wygladac po prostu pomimo ze przedstawiles pewna koncepcje niektore rzeczy po prostu przypuszczam ;)

0

Niestety ani jeden ani drugi przykład nie chce uaktualniać tabeli. Może postaram się opisać dokładniej problem i jeszcze go trochę rozwinę:
tblPodstawa:
id, Mod, dana1, dana2,dana3
1 10 200 aa bb
2 10 300 cc dd
3 25 200 ee ff
4 25 300 gg hh
5 10 100 ii jj
6 25 100 kk ll
..

tblRelacja:
dana1, danaX, DanaY
200 300 100
400 500 600

Do tej pory robiłem to na paradoxie w ten sposów:

  1. zaczytywałem wiersz z tblPodstawa
    for := 0 to tblPodstawa.RecordCount
    begin
    Szukana:=tblPodstawa.FieldbByName('Dana1').value;
    if tblRelacja.locate('Dana1',Szukana,[loCaseInsensitive]) then
    if not tblDane.locate('Dana1',Szukana,[loCaseInsensitive]) then
    begin
    tblDane.Append;
    tblDane.FieldByName('Dana1').value:=Szukana;
    tblDane.FieldByName('XXX').value:=XXX;
    tblDane.Post;
    end;
    else
    begin
    tblDane.edit;
    tblDane.FieldByName('Dana1').value:=Szukana;
    tblDane.FieldByName('XXX').value:=XXX;
    tblDane.Post;
    end;

następnie jeszcze tak:
for := 0 to tblPodstawa.RecordCount
begin
Szukana:=tblPodstawa.FieldByName('Dana1').value;
Szukana1:=tblPodstawa.FieldByName('Mod').value;
if tblRelacja.locate('DanaX',Szukana,[loCaseInsensitive]) then
tblDane.locate('Mod',Szukana1,[loCaseInsensitive]) then
begin
tblDane.edit;
tblDane.FieldByName('DanaX').value:=Szukana;
tblDane.FieldByName('XXX').value:=XXX;
tblDane.Post;
end;
itd... z DanaY...

wynik jest taki:

tblDane:
id,Mod, dana1, Dana2, Dana3,DanaX, DanaX2,DanaX3 DanaY DanaY2 DanaY3
1 10 200 aa bb 300 cc dd 100 ii jj
2 25 200 ee ff 300 gg hh 100 kk ll
3 ...

W paradoxie to wychodziło a jak to się w MySQL?

0

nie lepij zrobic tak:
tabele: tblDane (id, tblPod_id) najlepij ID zrobic AUTO_INCREMENT

i teraz:

najpierw ykonujemy zapytanie ktore nam pobiera wszystkie ID z tabeli tblPodstawa ktorych wartosc kolumny dana1 zawiera sie w tblRelacja:
SELECT id FROM tblPodstawa, tblRelacja WHERE tblPodstawa.dana1=tblRelacja.dana1 or tblPodstawa.dana1=tblRelacja.danaX or tblPodstawa.dana1=tblRelacja.danaY;

jakj juz pobierzemy te dane pozniej w petli dodajemy te ID do tblDane:

while($row = mysql_fetch_array($result))
{
mysql_query("INSERT INTO tblDane (tblPod_id) VALUES({$row['id']})");
}

i pozniej jak chcesz wyswietlic np wszystkie wiersze zawierajace mod 10 z tabeli tblDane poslugujesz sie relacja:
SELECT tblPodstawa.dana1, tblPodstawa.dana2, tblPodstawa.dana3 FROM tblDane, tblPodstawa WHERE tblDane.tblPod_id=tblPodstawa.id and tblPodstawa.mod=10;

rozwiazanie to raz zajmuje mniej miejsca wykonujesz znacznie szybsza operacje niz przepisywanei calych wierszy przepisuje tylko ID i wykorzystuje je jako relacje pomiedzy tabela tblDane a tblPodstawa tylko teraz inne pytanie czy to w ogole jest koniecne po co Ty w ogole przepisuejsz te dane do czego to pozniej uzywasz? Bo moe jest to zbedna peracje i mozna zalatwic ja wylacznie zapytaniem

0

Przeanalizowałem pierwszą cześć twojej odpowiedzi z selectem i ładnie wybiera numery id odpowiednich pasujących rekordów. Niestety z MySql jestem jeszcze zielony i nie bardzo wiem jak zabrać się do drugiej czesci z:

while($row = mysql_fetch_array($result))
{
mysql_query("INSERT INTO tblDane (tblPod_id) VALUES({$row['id']})");
}
Jak mam to użyć w kodzie? Możesz coś więcej podać?

A oto krótki opis problemu nad którym siedzę:
Mam baze w której sa czesci skladowe pewnych podzespolow, ktore tworzą produkty, gdzies ok. 1 mln pozycji. Do tej pory robilem to w paradoxie tyle ze baza byla dużo mniejsza. Wymysliłem sobie to tak, że założyłem bazę gdzie indeksem był podzespół i w ramach danego podzespołu w wierszu wrzucałem częsci należące do niego (wg tabeli relacji). Na tej podstawie mogłem raportować podzespoły,modyfikować wartości. zbierać w produkty. Można to zrobić w sql jeżeli nie mam tego poukladane w wierszu?

0

ten kawalek kodu ktory dalem jest w PHP z wykorzystaniem funkcji komunikujacych sie z serwerem mysql jezeli szukasz rozwiazania w delphi to dales temat w niewlasciwy dzial.

0

Jeżeli ten język ma takie możliwości to się przy czasie zainteresuję. No ale teraz muszę powalczyć jeszcze w Delphi. Może ma ktoś jeszcze jakieś pomyśły na rozwiązanie problemu zawartego w temacie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1