Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL]wybieranie z kilku tabel
Pcbecaw
post
Post #1





Grupa: Zarejestrowani
Postów: 236
Pomógł: 0
Dołączył: 4.06.2011

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


Wiem, ze to jest w manalu, ale probowalem na 10 sposobow i zawsze cos nie działalo. chcialbym wyszukiwac w 3 tabelach, obecnie zrobiłem dla jednej i co bym nie robił - zawsze wyskakuje bład, gdy probuje zrobic dla chociazby dwoch:
  1. $wynik = mysql_query('SELECT * FROM tabela1 where xx = "xxx" OR xx = "yyy"')

i jak teraz zrobic, zeby wyszukiwalo dodatkowo w tabela2 i tabela3 tych samych warunków?
bardzo prosze o pomoc

tak czytam wciąż o tym JOIN i dodam tylko, że tabele w żadnym stopniu nie są połączone. Po prostu chciałbym wyszukiwać z 3 tabel te rekordy, które w kolumnie 'xx' mają wpisane 'xxx' lub 'yyy'
jakby to zrobic?
Go to the top of the page
+Quote Post
Greg0
post
Post #2





Grupa: Zarejestrowani
Postów: 264
Pomógł: 54
Dołączył: 31.08.2007
Skąd: Tychy

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


  1. SELECT * FROM tabela1 t1, tabela2 t2, tabela3 t3 WHERE t1.xx IN ('xxx','yyy') OR t2.xx IN ('xxx','yyy') OR t3.xx IN ('xxx','yyy')

lub
  1. SELECT * FROM tabela1 t1, tabela2 t2, tabela3 t3 WHERE (t1.xx, t2.xx, t3.xx) IN ('xxx','yyy')

Z tym że drugie zapytanie raczej zadziała inaczej niż pierwsze smile.gif W pierwszym mamy OR w drugim raczej AND. Moge się mylić, nie testowałem

Ten post edytował Greg0 4.07.2013, 12:08:24
Go to the top of the page
+Quote Post
nospor
post
Post #3





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Greg twoj sposob jest zly bo zwraca iloczyn kartezjanski

Cytat
tak czytam wciąż o tym JOIN i dodam tylko, że tabele w żadnym stopniu nie są połączone.
Skoro nie sa w zaden sposob polaczone to masz uzyc UNION zamiast join


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Pcbecaw
post
Post #4





Grupa: Zarejestrowani
Postów: 236
Pomógł: 0
Dołączył: 4.06.2011

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


sposób Grega niestety rzeczywiście zwraca iloczyn kartezjański.
nospor, o union również czytałem i jeśli nawet napisałem poprawy warunek, to coś nie działa, bo wywala błąd i pewnie jest to kwestia nawiasów. Coś takiego:
  1. $wynik = mysql_query('SELECT * FROM tabela1 where xx = "xxx" OR xx = "yyy" UNION SELECT * FROM tabela2 where xx = "xxx" OR xx = "yyy"')
  2. or die('Błąd zapytania');

i leci błąd zapytania. pewnie kwestia nawiasow, ale nie wiem jak to naprawić
próbowałem jeszcez coś takiego:
  1. $wynik = mysql_query('SELECT * FROM tabela1 where xx = "xxx" OR xx = "yyy"') UNION ('SELECT * FROM tabela2 where xx = "xxx" OR xx = "yyy"')
  2. or die('Błąd zapytania');

ale też wywala błąd składniowy tym razem (error)

po zrobieniu czegoś takiego:
  1. $wynik = mysql_query("(SELECT * FROM tabela1 where xx = 'xxx' OR xx = 'yyy') UNION (SELECT * FROM tabela2 where xx = 'xxx' OR xx = 'yyy')")
  2. or die('Błąd zapytania');

nie wywala erroru, ale bład zapytania. jakiś progres jest, tylko jak napisać to poprawnie?
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No ale wyswietlaj blad a nie durny nic nie mowiacy tekst....
die(mysql_error());
i bedziesz wiedzial jaki masz blad

ps: liczba kolumn jakie zwracaja SELECT w union ma byc taka sama.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mmmmmmm
post
Post #6





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


1. Zrezygnuj z * - naprawdę nie znam sytuacji, w której byłyby nieodzowne.
2. Jak już to zrobisz i przeczytasz dokładnie komunikaty, to się dowiesz, że liczba kolumn w 1 i w 2 SELECT musi być taka sama. Inne DBMS-y wymagają również zgodności typów - jak MySQL to nie wiem, bo jak ognia unikam UNION
3. Postaraj się zrezygnować z UNION bo to zło.
4. Jeśli nie możesz to sprawdź różnicę między UNION a UNION ALL
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




ad3) Że niby czemu to zlo? UNION wymyslono w konkretnym celu i w tym wlasnie celu jest tutaj uzyty. Nie popadaj w paranoje


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mmmmmmm
post
Post #8





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


98% przypadków użycia UNION wynika albo ze złego przemyślenia struktury, albo z dupowatego bazodanowca.
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




To ze ktos nie umie uzywac UNION to nie znaczy ze UNION to zlo.... idac twoim tokiem myslenia mozna powiedziec, ze mozg to zło, bo 98% pytajacych na forum źle go uzywa...

Ostatnio pisalem duzy projekt, gdzie UNION niesamowicie przyspieszylo mi pewne zapytania i to nie dlatego, ze baza byla zla...


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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 Aktualny czas: 21.08.2025 - 18:46