Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL]Jak zgrupować dane w jednym wierszu a w kolejnych wierszach wyświetlić szczegóły?
Forum PHP.pl > Forum > Przedszkole
szczrzcz
Jak zgrupować dane w jednym wierszu a w kolejnych wierszach wyświetlić szczegóły.

Jak z dwóch tabel:
Kod
+---------------+-----------------+
| kategoria_id  | nazwa_kategori  |
+---------------+-----------------+
| 1             | sensacja        |
+---------------+-----------------+
| 2             | dramat          |
+---------------+-----------------+
| 3             | komedia         |
+---------------+-----------------+


Kod
+-------------+---------------+-------+
| ksiazka_id  | kategoria_id  | tytuł |
+-------------+---------------+-------+
| 1           | 1             | AAA   |
+-------------+---------------+-------+
| 2           | 1             | BBB   |
+-------------+---------------+-------+
| 3           | 2             | CCC   |
+-------------+---------------+-------+
| 4           | 2             | DDD   |
+-------------+---------------+-------+
| 5           | 3             | EEE   |
+-------------+---------------+-------+
| 6           | 3             | FFF   |
+-------------+---------------+-------+


osiągnąć coś takiego:
Kod
+------------------+-------+
| nazwa_kategorii  | tytuł |
+------------------+-------+
| sensacja         |       |
+------------------+-------+
|                  | AAA   |
+------------------+-------+
|                  | BBB   |
+------------------+-------+
| dramat           |       |
+------------------+-------+
|                  | CCC   |
+------------------+-------+
|                  | DDD   |
+------------------+-------+
| komedia          |       |
+------------------+-------+
|                  | EEE   |
+------------------+-------+
|                  | FFF   |
+------------------+-------+
nospor
Zapewne potrzebne ci to do wyswietlania wiec
http://nospor.pl/grupowanie-wynikow.html
szczrzcz
chciałbym dokładnie taki wynik zapytania. Czy da się to zrobić czystym SQL?
nospor
Raczej nie. A jesli nawet by sie dalo, to bylby to przerost tresci nad forma
6nom
Cytat(szczrzcz @ 26.06.2017, 11:35:57 ) *
chciałbym dokładnie taki wynik zapytania. Czy da się to zrobić czystym SQL?


Tak, dość prosto:

  1. SELECT
  2. x.nazwa_kategorii, x.tytul
  3. FROM
  4. (
  5. SELECT b.kategoria_id, NULL nazwa_kategorii, b.tytul FROM ksiazka b
  6. UNION
  7. SELECT c.kategoria_id, c.nazwa_kategorii, NULL tytul FROM kategoria c
  8. ) x
  9. ORDER BY
  10. x.kategoria_id, x.nazwa_kategorii nulls last, x.tytul
szczrzcz
Cytat(6nom @ 26.06.2017, 14:43:37 ) *
Tak, dość prosto:

Możesz rzucić okiem czy poprawnie przerobiłem rzeczywistą bazę?:
  1. SELECT
  2. x.sku, x.product_name
  3. FROM
  4. ((SELECT pt.name AS `product_name`, v.sku, p.id
  5. FROM `product` p
  6. LEFT JOIN `product_translation` pt ON p.id=pt.translatable_id
  7. LEFT JOIN `product_status_translation` pst ON p.status_id=pst.translatable_id
  8. LEFT JOIN `product_variation` v ON p.id=v.product_id WHERE pst.locale='en'
  9. ORDER BY p.id )
  10. UNION
  11. (SELECT pt.name AS `product_name`, v.sku, p.id
  12. FROM `product` p
  13. LEFT JOIN `product_translation` pt ON p.id=pt.translatable_id
  14. LEFT JOIN `product_status_translation` pst ON p.status_id=pst.translatable_id
  15. LEFT JOIN `product_variation` v ON p.id=v.product_id WHERE pst.locale='en'
  16. GROUP BY p.id ORDER BY p.id ))x
  17. ORDER BY
  18. x.id





To jednak nie o to mi chodziło. Kluczowe dla mnie było by wiersz grupujący był NAD wierszami danej grupy.
6nom
A co jest grupownikiem? Jeżeli dobrze widzę, to product_name?

W rozwiązaniu, które podałem chodzi o to, że warianty produktów mają NULL w nazwie produktu, a nazwy (kategorie) produktów mają NULL w wariancie (v.sku) i cały "myk" jest w późniejszym posortowaniu tego.

Najpierw po wspólnym id, później po nazwie kategorii, a na koniec ewentualnie po wariancie. Warianty produktów będą miały NULL w nazwie kategorii więc spadną niżej jak się określi w sortowaniu, że wartości nullowe mają być na końcu.

Podałem rozwiązanie z Postgresa, nie wiem czy w MySQL jest "order by (...) nulls last", czy domyślnie w MySQL nulle wpadają na koniec, czy jest jakiś inny sposób. Jeśli nie ma, to wystarczy dodać stałą do każdego podzapytania, po której posortujesz zamiast odnosić się do nulli.

Twoje zapytanie pewnie będzie wyglądało w ten sposób:

  1. SELECT
  2. x.product_name, x.sku
  3. FROM
  4. (
  5. --warianty produktow
  6. SELECT
  7. NULL AS `product_name`, v.sku, p.id
  8. FROM
  9. `product` p
  10. LEFT JOIN `product_translation` pt ON p.id=pt.translatable_id
  11. LEFT JOIN `product_status_translation` pst ON p.status_id=pst.translatable_id
  12. LEFT JOIN `product_variation` v ON p.id=v.product_id WHERE pst.locale='en'
  13.  
  14. UNION
  15.  
  16. --kategorie
  17. SELECT
  18. pt.name AS `product_name`, NULL AS `sku`, pt.translatable_id AS id
  19. FROM
  20. `product_translation` pt
  21. GROUP BY
  22. pt.translatable_id
  23. ) x
  24. ORDER BY
  25. x.id, x.product_name, x.sku


BTW: Brakuje mi tu jeszcze jakiegoś warunku na język w nazwie produktu, bo dla product_variation jest en, a dla product_translation nie ma. Chyba, że czegoś nie widzę
szczrzcz
Genialne
(tzn poza tym, że wiersze grupujące mam pod a nie nad wierszami wariantów, ale pokazałeś że można).

dziękuję.
6nom
Nie ma za co;-)

Cytat(szczrzcz @ 27.06.2017, 17:21:29 ) *
(...) poza tym, że wiersze grupujące mam pod a nie nad wierszami wariantów(...).


To możesz wprowadzić sztuczną kolumnę (nazwijmy ją kolejnosc, po której posortujesz:

  1. SELECT
  2. x.product_name, x.sku
  3. FROM
  4. (
  5. --warianty produktow
  6. SELECT
  7. NULL AS `product_name`, v.sku, p.id, 2 AS `kolejnosc`
  8. FROM
  9. `product` p
  10. LEFT JOIN `product_translation` pt ON p.id=pt.translatable_id
  11. LEFT JOIN `product_status_translation` pst ON p.status_id=pst.translatable_id
  12. LEFT JOIN `product_variation` v ON p.id=v.product_id WHERE pst.locale='en'
  13.  
  14. UNION
  15.  
  16. --kategorie
  17. SELECT
  18. pt.name AS `product_name`, NULL AS `sku`, pt.translatable_id AS id, 1 AS `kolejnosc`
  19. FROM
  20. `product_translation` pt
  21. GROUP BY
  22. pt.translatable_id
  23. ) x
  24. ORDER BY
  25. x.id, x.kolejnosc, x.sku
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.