Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SQL]Jak zgrupować dane w jednym wierszu a w kolejnych wierszach wyświetlić szczegóły?
szczrzcz
post 26.06.2017, 11:17:42
Post #1





Grupa: Zarejestrowani
Postów: 153
Pomógł: 0
Dołączył: 20.04.2017
Skąd: Warszawa

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


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   |
+------------------+-------+
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
nospor
post 26.06.2017, 11:20:01
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Zapewne potrzebne ci to do wyswietlania wiec
http://nospor.pl/grupowanie-wynikow.html


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
szczrzcz
post 26.06.2017, 11:35:57
Post #3





Grupa: Zarejestrowani
Postów: 153
Pomógł: 0
Dołączył: 20.04.2017
Skąd: Warszawa

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


chciałbym dokładnie taki wynik zapytania. Czy da się to zrobić czystym SQL?
Go to the top of the page
+Quote Post
nospor
post 26.06.2017, 11:39:22
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Raczej nie. A jesli nawet by sie dalo, to bylby to przerost tresci nad forma


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
6nom
post 26.06.2017, 13:43:37
Post #5





Grupa: Zarejestrowani
Postów: 14
Pomógł: 5
Dołączył: 27.08.2009

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


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
Go to the top of the page
+Quote Post
szczrzcz
post 26.06.2017, 21:00:54
Post #6





Grupa: Zarejestrowani
Postów: 153
Pomógł: 0
Dołączył: 20.04.2017
Skąd: Warszawa

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


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.

Ten post edytował szczrzcz 26.06.2017, 21:09:59
Go to the top of the page
+Quote Post
6nom
post 27.06.2017, 16:41:48
Post #7





Grupa: Zarejestrowani
Postów: 14
Pomógł: 5
Dołączył: 27.08.2009

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


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ę
Go to the top of the page
+Quote Post
szczrzcz
post 27.06.2017, 17:21:29
Post #8





Grupa: Zarejestrowani
Postów: 153
Pomógł: 0
Dołączył: 20.04.2017
Skąd: Warszawa

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


Genialne
(tzn poza tym, że wiersze grupujące mam pod a nie nad wierszami wariantów, ale pokazałeś że można).

dziękuję.

Ten post edytował szczrzcz 27.06.2017, 18:23:37
Go to the top of the page
+Quote Post
6nom
post 27.06.2017, 18:51:20
Post #9





Grupa: Zarejestrowani
Postów: 14
Pomógł: 5
Dołączył: 27.08.2009

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


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
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 Wersja Lo-Fi Aktualny czas: 14.08.2025 - 02:50