Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zduplikowane wyniki zapytania SQL
Kedan
post
Post #1





Grupa: Zarejestrowani
Postów: 53
Pomógł: 1
Dołączył: 20.07.2007

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


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?

Ten post edytował Kedan 4.06.2010, 00:18:31
Go to the top of the page
+Quote Post
Pilsener
post
Post #2





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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.
Go to the top of the page
+Quote Post
Kedan
post
Post #3





Grupa: Zarejestrowani
Postów: 53
Pomógł: 1
Dołączył: 20.07.2007

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


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.

Ten post edytował Kedan 4.06.2010, 23:27:15
Go to the top of the page
+Quote Post
Mchl
post
Post #4





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


A to żeś sobie wykoncypował...

Mógłbyś pokazać jak to wygląda?
Go to the top of the page
+Quote Post
Kedan
post
Post #5





Grupa: Zarejestrowani
Postów: 53
Pomógł: 1
Dołączył: 20.07.2007

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


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.
Go to the top of the page
+Quote Post
Mchl
post
Post #6





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


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ę.
Go to the top of the page
+Quote Post
Kedan
post
Post #7





Grupa: Zarejestrowani
Postów: 53
Pomógł: 1
Dołączył: 20.07.2007

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


  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
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 - 19:10