Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL] GROUP BY i tylko zwracaty 1 wynik
Forum PHP.pl > Forum > Bazy danych > MySQL
Dragas
Witam
Chciałby poprosić o pomoc w rozwiązaniu problemu:
Najpierw przedstawię kod zapytania:
  1. SELECT
  2. ksiazki.id AS `id`,
  3. ksiazki.cena AS `cena`,
  4. ksiazki.nazwa AS `nazwa`,
  5. kup.ksiazkaid,
  6. kup.id,
  7. count(kup.id) AS `kupione`
  8. FROM
  9. ksiazki,
  10. kup
  11. WHERE
  12. lower(ksiazki.nazwa) LIKE '%Sienkiewicz%'
  13. AND kup.ksiazkaid = ksiazki.id
  14. GROUP BY ksiazki.id


Problem polega na tym, że jeśli wykonam kod
  1. SELECT * FROM ksiazki WHERE lower(ksiazki.nazwa) LIKE '%Sienkiewicz%' AND ksiazki.id = kup.ksiazkaid

To zrwaca mi prawidłowo 2 rekordy, gdzie w nazwie występuje 'Sienkiewicz', lecz jeśli chcę zliczyć ilość zakupień książki (nie ważne czy klient kupił 1 czy 10), to pokazuje mi tylko 1 rekord od góry. Jeśli daje bez GROUP BY to zrwaca błąd (bo wyniki muszą być pogrupowane).

Patrzyłęm w manuala, w kursy pomocnicze, lecz nie ma tam podobnych przykładów.

Pozdrawiam Dragas
rocktech.pl
Witam.

Spróbuj tak.

  1. SELECT
  2.  
  3. ksiazki.id AS `id`,
  4.  
  5. ksiazki.cena AS `cena`,
  6.  
  7. ksiazki.nazwa AS `nazwa`,
  8.  
  9. kup.ksiazkaid,
  10.  
  11. kup.id,
  12.  
  13. count(kup.id) AS `kupione`
  14.  
  15. FROM
  16. ksiazki,
  17.  
  18. LEFT JOIN
  19. kup
  20. ON
  21. (kup.ksiazkaid = ksiazki.id)
  22. WHERE
  23. lower(ksiazki.nazwa) LIKE '%Sienkiewicz%'
  24. GROUP BY
  25. ksiazki.id
Dragas
Niestety, ale pokazuje się błąd o następującej treści: Something is wrong in your syntax obok 'LEFT JOIN kup ON (kup.ksiazkaid = ksiazki'.
Niktoś
ksiazki i kup to aliasy?Przed left join masz przecinek po nazwie kolumny ksiazki, i może on powodować błąd.
Dragas
Nazwy ksiazki i kup to nie są aliasy, lecz nazwy tabel.
Kod działa już lepiej, lecz pierwszy wynik jest w całości zrwacany, lecz drugi jest zwracany w szczątkowej postaci, tzn.: cześć kolumn dostępna jest po nazwach czy aliasach kolumn tylko i wyłącznei przy pierwszym wywołaniu, tak jest np. z "ksiazki.cena AS `cena`". Do $row['cena'] mogę odwołąć się tylko za pierwszym wywyłaniem mysql_fetch_array, lecz za kolejnymi, muszę użyć indeksu kolumny, np. $row['2'].
Na razie wyświetlam przy użyciu rekordy przy użyciu indeksów, lecz czy można zrobić tak, aby nazwy kolumn były dostępne przy każdorazowym wywołaniu mysql_fetch_array()? Ponieważ nigdy nie spotkałem się z taką zagadką.
Pozdrawiam Dragas
mortus
Bo powinieneś grupować po kup.ksiazkaid, a nie ksiazki.id, zarówno w Twoim pierwszym zapytaniu, jak i w tym przedstawionym przez rocktech.pl. Wyrzuć też pola kup.id i kup.ksiazkaid z listy wybieranych pól, bo są tam zbędne (kup.ksiazkaid to ksiazka.id, a id zakupu jest niepotrzebne w ogóle).

EDIT1: Zresztą to i tak nie przejdzie, i nie obejdzie się bez podzapytania.

EDIT2: Podzapytań można użyć na dwa sposoby. Tak:
  1. SELECT `k`.`id`, `k`.`cena`, `k`.`nazwa`, (SELECT COUNT(`kup`.`id`) FROM `kup` WHERE `kup`.`ksiazkaid` = `k`.`id`) AS `kupione` FROM `ksiazki` `k` WHERE lower(`k`.`nazwa`) LIKE '%Sienkiewicz%'

lub tak:
  1. SELECT `k`.`id`, `k`.`cena`, `k`.`nazwa`, `kupione_ksiazki`.`liczba` AS `kupione` FROM `ksiazki` `k` LEFT JOIN (SELECT `kup`.`ksiazkaid`, COUNT(`kup`.`id`) AS `liczba` FROM `kup` GROUP BY `kup`.`ksiazkaid`) AS `kupione_ksiazki` ON `kupione_ksiazki`.`ksiazkaid` = `k`.`id`;


EDIT3: Po głębszym namyśle doszedłem do wniosku, że wszystkie zapytania powinny zadziałać, a na pewno zapytanie by rocktech.pl (oczywiście jeśli pogrupujesz po odpowiedniej kolumnie).
Dragas
Dziękuję serdecznei za pomoc, sam raczej nie dałbym sobie z tym rady.
Problem rozwiązałem przy użyciu pierwszego zapytania kolegi mortus.

Szczerze powiem, że nie wiedziałem, że w mysql'u można używać takich zapytań z podzapytaniami, bo wiem, że w MSSQL jest to możliwe.

Jeszcze raz dziękuję!

Pozdrawiam Dragas
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.