![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 29 Pomógł: 0 Dołączył: 3.04.2011 Ostrzeżenie: (0%) ![]() ![]() |
Witam, czy istnieje możliwośc połączenia zapytania SELECT z zapytaniem UPDATE?
|
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 29 Pomógł: 0 Dołączył: 3.04.2011 Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował Takuro 4.05.2012, 07:57:59 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
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:
Pamiętaj, aby testować na kopii tabeli. Ten post edytował mortus 4.05.2012, 09:16:20 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 29 Pomógł: 0 Dołączył: 3.04.2011 Ostrzeżenie: (0%) ![]() ![]() |
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)
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
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.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 29 Pomógł: 0 Dołączył: 3.04.2011 Ostrzeżenie: (0%) ![]() ![]() |
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.
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 06:37 |