Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zduplikowane wyniki zapytania SQL
Forum PHP.pl > Forum > Bazy danych > MySQL
Kedan
Witam.

Mam kod:
  1. SELECT `m`.`id` AS `id`, `m`.`name` AS `name`, `m`.`description` AS `description`, `m`.`edate` AS `edate`
  2. FROM (`menu` AS `m`)
  3. WHERE `m`.`name` = 'aaa' OR `m`.`name` = 'Menu'

Zapytanie poprawnie zwraca dwa wyniki:
  1. (
  2. [0] => stdClass Object
  3. (
  4. [id] => 1666514540
  5. [name] => Menu
  6. [description] => All menu here!!
  7. [edate] => 2010-04-25
  8. )
  9.  
  10. [1] => stdClass Object
  11. (
  12. [id] => 510733235
  13. [name] => aaa
  14. [description] => aaa
  15. [edate] => 2010-04-29
  16. )
  17.  
  18. )


Natomiast gdy dodam kilka innych tabel do zapytania:
  1. SELECT `m`.`id` AS `id`, `m`.`name` AS `name`, `m`.`description` AS `description`, `m`.`edate` AS `edate`
  2. FROM (`menu` AS `m`, `relation_menu-group` AS `rmg`, `group` AS `rgs`)
  3. WHERE `m`.`name` = 'aaa' OR `m`.`name` = 'Menu'

wyników jest już więcej (konkretnie 12).

Czy ktoś mógłby mi powiedzieć dlaczego?
Pilsener
Bo stosujesz iloczyn kartezjański tabel, który nie powinien być używany z tej prostej przyczyny, że jak pobierasz dane z dwóch tabel po 3 rekordy to wyników masz 9, jeśli dojdzie 3-cia tabela to już 27 i tak dalej. Poczytaj o złączaniu tabel przy pomocy JOIN.
Kedan
No właśnie tego się obawiałem. Problem polega na tym, że relacje pomiędzy tabelami trzymam sobie w osobnej tabeli - i szczerze mówiąc zastanawiam się czy to faktycznie był dobry pomysł. Plus jest taki, że z php mogę swobodnie dodawać i usuwać relacje z dowolną ilością tabel nie ingerując w ich strukturę. Gdybym korzystał z JOIN, to przy dodaniu relacji z nową tabelą musiałbym pewnie dodać nową kolumnę. No chyba że będę JOIN'ował trzy tabele zamiast dwóch.
Mchl
A to żeś sobie wykoncypował...

Mógłbyś pokazać jak to wygląda?
Kedan
Raczej nie bardzo, bo musiałbym sporą część cms'a przeklejać. Po prostu w tabeli-relacji trzymam sobie identyfikatory z tabeli-danych. Sprawę załagodziłem przez GROUP BY 'id' - wiem, to tylko obejście problemu a nie jego rozwiązanie.
Mchl
Nom. To Ci tylko wynik poprawia, bo ilozcyn i tak jest robiony, więc wydajność tego będzie marna. Już raczej łącz przez tą trzecią tabelę.
Kedan
  1. SELECT `menu`.`id`,`menu`.`name`,`group`.`name` AS `group-name`
  2. FROM `menu`
  3. LEFT JOIN `relation_menu-group` ON `relation_menu-group`.`id0`=`menu`.`id`
  4. LEFT JOIN `group` ON `group`.`id`=`relation_menu-group`.`id1`
  5. WHERE `menu`.`id`=0 AND `group`.`name`='Test Group'

Jest ok. Dzięki za rozwianie moich wątpliwości smile.gif
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-2025 Invision Power Services, Inc.