MySQL: GROUP_CONCAT

Ostatnio zostałem poproszony, aby na liście zamówień w sklepie PrestaShop wyświetlić listę produktów, które zostały sprzedane. Oczywiście można by było tworzyć kolejne zapytanie i za pomocą pętli iterować kolejne wiersze z drugiej tabeli, ale również można zrobić wszystko za pomocą jednego zapytania.Trochę rozjaśnię sytuację. PrestaShop domyślnie prezentuje informacje o zamówieniach z tabeli ps_orders. Natomiast informacje o konkretnych sprzedanych produktach znajdziemy w tabeli ps_order_detail. Oczywiście można stworzyć nowe zapytanie i pobrać dane z tabeli ps_order_detail, następnie wyniki iterować tak, aby otrzymać listę produktów dla konkretnego zamówienia. Rozwiązanie to jednak wiązałoby się ze znacznymi modyfikacjami w kodzie samej Presty, dlatego też znalazłem dużo prostsze rozwiązanie. Możemy otrzymać interesujące nas dane korzystając z magicznego MySQL’owego GROUP_CONTAT.

1
2
3
4
5
6
7
8
9
10
SELECT
    a.`id_order`,
    (
        SELECT
            GROUP_CONCAT(od.`product_name` SEPARATOR ', ')
        FROM `ps_order_detail` od
        GROUP BY od.`id_order`
        HAVING od.`id_order`=a.`id_order`
    ) AS products
FROM `ps_orders` a

Dzięki powyższemu zapytaniu otrzymujemy listę produktów dla konkretnego zamówienia. Produkty są oddzielone w tym przypadku przecinkiem 🙂

Comments

ircykk

Heh właśnie czegoś takiego szukałem do panelu admina w PrestaShop. Chciałem mieć nazwy produktów na liście zamówień. Wydaja się że zamiast HAVING powinno być zwykłe WHERE, ja dałem ta:

(
SELECT
GROUP_CONCAT(od.`product_name` SEPARATOR „, „)
FROM `ps_order_detail` od
WHERE od.`id_order` = a.`id_order`
GROUP BY od.`id_order`
) AS `products`,

Pozdrawiam

Reply

Leave a Comment

1 × 3 =