source

하위 쿼리의 문자열을 MySQL의 단일 행으로 연결하려면 어떻게 해야 합니까?

nicesource 2023. 7. 28. 22:09
반응형

하위 쿼리의 문자열을 MySQL의 단일 행으로 연결하려면 어떻게 해야 합니까?

세 개의 테이블이 있습니다.

table "package"
-----------------------------------------------------
package_id      int(10)        primary key, auto-increment
package_name    varchar(255)
price           decimal(10,2)

table "zones"
------------------------------------------------------
zone_id         varchar(32)    primary key (ex of data: A1, Z2, E3, etc)

table "package_zones"
------------------------------------------------------
package_id     int(10)
zone_id        varchar(32)

제가 하려는 것은 패키지 테이블의 모든 정보와 해당 패키지에 대한 영역 목록을 반환하는 것입니다.나는 알파벳순으로 정렬된 구역 목록과 쉼표로 구분된 구역 목록을 원합니다.

그래서 제가 찾고 있는 출력은 다음과 같습니다.

+------------+---------------+--------+----------------+
| package_id | package_name  | price  | zone_list      |
+------------+---------------+--------+----------------+
| 1          | Red Package   | 50.00  | Z1,Z2,Z3       |
| 2          | Blue Package  | 75.00  | A2,D4,Z1,Z2    |
| 3          | Green Package | 100.00 | B4,D1,D2,X1,Z1 |
+------------+---------------+--------+----------------+

원하는 결과를 얻기 위해 프레젠테이션 레이어를 사용하여 PHP로 무언가를 할 수 있다는 것을 알고 있습니다.문제는, 제가 분류할 수 있기를 원한다는 것입니다.zone_list ASC또는DESC심지어 사용하기도 합니다.WHERE zone_list LIKE등등.그러기 위해서는 MySQL에서 이 작업을 수행해야 합니다.

어떻게 이 문제를 해결해야 할지 전혀 모르겠습니다.하위 쿼리를 사용하려고 했지만 여러 행에 대한 불만이 계속 제기되었습니다.하려고 했습니다.concat여러 행을 하나의 문자열로 만들었지만 MySQL은 이것을 좋아하지 않습니다.

잘 부탁드립니다.


업데이트!

관심 있는 사용자를 위한 솔루션은 다음과 같습니다.

SELECT 
    `package`.*,
    GROUP_CONCAT(`zones`.`zone` ORDER BY `zones`.`zone` ASC SEPARATOR ','  )  as `zone_list`
FROM 
    `package`,
    `package_zones`
LEFT JOIN 
    (`zones`,`ao_package_zones`) ON (`zones`.`zone_id` = `package_zones`.`zone_id` AND `package_zones`.`package_id` = `package`.`package_id`)
GROUP BY 
    `ao_package`.`package_id`

GROUP_CONCAT() 함수와 GROUP BY 호출을 사용합니다.여기 쿼리 예제가 있습니다.

SELECT 
   p.package_id,
   p.package_name,
   p.price,
   GROUP_CONCAT(pz.zone_id SEPARATOR ',') as zone_list 
FROM 
   package p 
LEFT JOIN package_zone pz ON p.package_id = pz.package_id 
GROUP BY 
   p.package_id

여전히 zone_ids(또는 zone_list)로 주문할 수 있어야 합니다.LIKE사용할 수 있습니다.WHERE zp.zone_id = 'Z1'아니면 비슷한 것.

ps_orders, ps_customer table에서 작년 기록을 가져오기 위해 ps_orders 데이터베이스에서 사용할 쿼리를 생성해 달라고 요청한 고객이 있습니다. 이 열 중 하나는 ps_order_detail table의 "The list of product ids in the order"였습니다.그래서 제 질문 결과는 다음과 같습니다.

SELECT 
    o.id_order, o.reference, 
    (
        SELECT 
            GROUP_CONCAT(od.product_id SEPARATOR ', ') AS products 
        FROM ps_order_detail od 
        WHERE od.id_order = o.id_order 
        GROUP BY od.id_order
    ) AS product_ids,
    CONCAT(c.firstname, ' ', c.lastname) AS customer, o.current_state, o.payment, o.total_discounts, 
    o.total_discounts_tax_incl, o.total_discounts_tax_excl, o.total_paid, o.total_paid_tax_incl,
    o.total_paid_tax_excl, o.total_products, o.total_products_wt, o.total_shipping, o.total_shipping_tax_incl, 
    o.total_shipping_tax_excl, o.carrier_tax_rate, o.total_wrapping, o.total_wrapping_tax_incl, 
    o.total_wrapping_tax_excl, o.invoice_number, o.delivery_number, o.valid
FROM ps_orders o
INNER JOIN ps_customer c ON c.id_customer = o.id_customer
WHERE 
    o.date_add <= NOW() AND o.date_add >= DATE_ADD(NOW(), INTERVAL - 12 MONTH);

결과:

enter image description here

언급URL : https://stackoverflow.com/questions/3935695/how-do-i-concatenate-strings-from-a-subquery-into-a-single-row-in-mysql

반응형