2

今日、MySQL 関数を使用しているときに、非常に奇妙な問題に遭遇しましたGROUP_CONCAT

次のクエリがあります。

SELECT SUM(total) FROM order WHERE customer_id='X' AND order_status_id IN ((SELECT GROUP_CONCAT(order_status_id SEPARATOR ',') FROM order_status WHERE profit='1'))

ただし、NULL を返します。

SELECT SUM(total) FROM order WHERE customer_id='X' AND order_status_id IN (1,2,3,4,5,6,7,8)

これは、グループ化されたステータスIDを連結する最初のクエリと同様に機能しますが、合計としてNULLを返します

4

2 に答える 2

3

GROUP_CONCAT()単一の値である文字列を返します。このIN()句は、コンマ区切りの値のリストを受け入れますが、指定した文字列だけを取得して個々の値を解析するわけではありません。

の結果をGROUP_CONCAT()単一の文字列ユニットとして扱います。これは、コンマ区切りリスト内の他の多くの文字列のメンバーである可能性がありますが、一致する行はありませんorder_status_id = '1,3,5,6'。これは、RDBMS が最終的に確認するものです。

IN()その句にクエリを使用する場合は、サブクエリを使用します。このIN ()句は、サブクエリによって返された行セットを処理する方法を認識しており、適切に処理します。

SELECT
  SUM(total) 
FROM order 
WHERE 
  customer_id='X' 
  AND order_status_id IN (
    SELECT order_status_id FROM order_status WHERE profit = '1'
  );
于 2012-08-07T14:04:00.017 に答える
1

ご質問について。FIND_IN_SET 関数を使用してみてください -

SELECT
  SUM(total)
FROM
  `order`
WHERE
  customer_id='X' AND
  FIND_IN_SET(
    order_status_id,
    (SELECT GROUP_CONCAT(order_status_id) FROM order_status WHERE profit='1')
  )

JOIN 句を使用することをお勧めします。例えば ​​-

SELECT o.* FROM `order` o
  JOIN order_status os
    ON o.order_status_id = os.order_status_id
WHERE o.customer_id='X' AND os.profit = 1

...次に、必要な集計関数を追加します。

于 2012-08-07T14:08:52.293 に答える