Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MYSQL] GROUP BY i tylko zwracaty 1 wynik
Dragas
post
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.12.2011
Skąd: Bydgoszcz

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


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
Powód edycji: [piotrooo89]: przenosze
Go to the top of the page
+Quote Post
rocktech.pl
post
Post #2





Grupa: Zarejestrowani
Postów: 587
Pomógł: 131
Dołączył: 8.02.2010

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


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


Ten post edytował rocktech.pl 28.12.2011, 11:05:22
Go to the top of the page
+Quote Post
Dragas
post
Post #3





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.12.2011
Skąd: Bydgoszcz

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


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'.
Go to the top of the page
+Quote Post
Niktoś
post
Post #4





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


ksiazki i kup to aliasy?Przed left join masz przecinek po nazwie kolumny ksiazki, i może on powodować błąd.

Ten post edytował Niktoś 28.12.2011, 17:02:27
Go to the top of the page
+Quote Post
Dragas
post
Post #5





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.12.2011
Skąd: Bydgoszcz

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


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





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

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


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).

Ten post edytował mortus 28.12.2011, 17:50:19
Go to the top of the page
+Quote Post
Dragas
post
Post #7





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.12.2011
Skąd: Bydgoszcz

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


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

Ten post edytował Dragas 28.12.2011, 17:59:13
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.12.2025 - 15:04