Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Łączenie zapytań
Takuro
post 3.05.2012, 23:54:47
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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
mortus
post 4.05.2012, 07:14:34
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Takuro
post 4.05.2012, 07:57:19
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
Go to the top of the page
+Quote Post
mortus
post 4.05.2012, 08:27:13
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:
  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.

Ten post edytował mortus 4.05.2012, 09:16:20
Go to the top of the page
+Quote Post
Takuro
post 4.05.2012, 08:45:15
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)
Go to the top of the page
+Quote Post
mortus
post 4.05.2012, 09:21:58
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.
Go to the top of the page
+Quote Post
Takuro
post 4.05.2012, 09:40:14
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.
Go to the top of the page
+Quote Post
mortus
post 4.05.2012, 20:32:01
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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 06:37