Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Łączenie zapytań
Forum PHP.pl > Forum > Bazy danych > MySQL
Takuro
Witam, czy istnieje możliwośc połączenia zapytania SELECT z zapytaniem UPDATE?
mortus
To zależy od tego, w jaki sposób miałyby być one połączone. Można w taki sposób robić UPDATE:
  1. UPDATE `table1` SET `column1` = (SELECT `column1` FROM `table2` WHERE ...)

Obie tabele muszą być jednak różne.
Takuro
Ogólnie chce zrobić tak, że mam zapytanie takie:
Kod
SELECT u.id, u.money, u.respekt, u.gamepoints, h.h_id, h.faremonay, h.farerespekt, h.faregp FROM user_date u LEFT JOIN date_house h ON u.renthouse = h.h_id WHERE u.renthouse > 0 AND h.rent > 0

Chciałbym "dorobić" tak, że jeżeli u.money < h.faremonay i u.respekt < h.farerespekt oraz u.gamepoints < h.faregp to wykona się zapytanie typu:
UPDATE `user_date` SET `renthouse` = '0' WHERE `id` = u.id i UPDATE `date_house` SET `rents` = `rents` -1 WHERE `h_id` = h_id

Całą operacje robię w pętli while, dlatego też nie mogę zrobić jednego zpaytania przed pętlą jako glówne i w pętli kolejne, by by było zapytanie w zapytaniu. Dlatego też proszę o pomoc jak to połączyć, kożystając z podzapytań wydaje mi się to nieco łatwe do wykonania, lecz już się tak zamotałem, że nie wiem teraz jak zedytować moje pierwotne zapytanie.
mortus
Wydaje mi się, że jest to do zrobienia. Trzeba posłużyć się zapytaniem typu UPDATE ... JOIN .... Przy czym, nie do końca rozumiem, co chcesz zrobić (możliwe, że ta niewiedza wynika z braku informacji na temat struktury tabel i relacji). Może chodzi o coś takiego:
  1. UPDATE user_date u LEFT JOIN date_house h ON u.renthouse = h.h_id
  2. SET
  3. u.renthouse = 0,
  4. h.rents = h.rents - 1
  5. WHERE u.money < h.faremonay OR u.respekt < h.farerespekt OR u.gamepoints < h.faregp

Pamiętaj, aby testować na kopii tabeli.
Takuro
Sprawdzę to, ale tym czasem opiszę jaki wynik chcę osiągnąć...

Pobieram dane z tabeli `user_date`: id, money, respekt oraz gamepoints. Pobieram dane też z tabeli `date_house`: h_id, faremonay, farerespekt oraz faregp. Oba te zapytania połączyłem w jedno, a łącze je po tym: renthouse = h_id (kolumna renthouse jest w tabeli user_date i zawiera id domu z tabeli date_house) -> to wszystko zrobiłęm takim zapytaniem:
Kod
SELECT u.id, u.money, u.respekt, u.gamepoints, h.h_id, h.faremonay, h.farerespekt, h.faregp FROM user_date u LEFT JOIN date_house h ON u.renthouse = h.h_id WHERE u.renthouse > 0 AND h.rent > 0

(Wszystkie pola jakie używam są typu integer)
Teraz to zapytanie co już zrobiłęm chce przeedytować tak, że jeżeli money, respekt lub gamepoints jest mniejsze od faremonay, farerespekt lub faregp (wystarczy, że jedna kolumna jest mniejsza) to miało by się wykonać zapytanie UPDATE, które by w tabeli user_date w polu renthouse ustawiło 0(a przypomnę, że wcześniej zawierało identyfikator danego domu).

Szukam od rana coś o IF..end if w mysql lecz zbyt dużo jak narazie o tym nei znalazłem, dlatego prosiłbym o pomoc.


Próbowałem robić to jakoś tak, bez if'a: (testowałem to tylko na money < faremonay - ale i tka nei działa)
Kod
SELECT u.id, u.money, u.respekt, u.gamepoints, h.h_id, h.faremonay, h.farerespekt, h.faregp FROM user_date u LEFT JOIN date_house h ON u.renthouse = h.h_id WHERE u.renthouse > 0 AND h.rent > 0 OR u.money < h.faremonay OR u.money < h.faremonay = (UPDATE user_date SET renthouse = 0 WHERE id = u.id)
mortus
Skoro tak to w powyższym trzeba zastąpić AND OR-em. Niestety jeśli działasz na kolumnie, która jest kluczem obcym, to nie będziesz mógł zmienić jej wartości na 0, co wynika z definicji klucza obcego. Nie jestem pewien, czy da się to ominąć, ale sądzę, że nie ma takiej możliwości.
Takuro
A może da się to wykonać jakoś inaczej? No nie wiem jak to określić, bo jak narazie mysql używałem do pobrania czegoś, usunięcia itp - takie podstawowe zapytania więc nie jestem jakiś dobry w te klocki.
mortus
Jeżeli silnik na jakim działają tabele to InnoDB, a relacje pomiędzy tabelami są zdefiniowane w strukturze tabeli przy pomocy klucza obcego, to nie wstawisz wartości 0 w kolumnie `renthouse` tabeli `user_date`. No chyba, że w tabeli `date_house` znajduje się rekord, dla którego wartość kolumny `h_id` wynosi 0. Nie ma znaczenia, czy posłużysz się tutaj instrukcją warunkową, czy jakimś zaawansowanym UPDATE + JOIN.
Jeśli natomiast tabele działają na innym silniku lub też relacje pomiędzy tymi tabelami są umowne (tzn. my wiemy, że one są, ale w systemie baz danych nie są one zdefiniowane) to najprawdopodobniej podany wyżej UPDATE rozwiąże Twój problem.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.