bugfix> sql > 投稿

MySQLテーブル products があります 、次のようになります。

|--------------------|
| id | parent | sold |
|--------------------|
| 1  | 0      | 1    |
| 2  | 1      | 3    |
| 3  | 1      | 0    |
| 4  | 0      | 2    |
|--------------------|

製品が販売された回数の結果を取得したい。製品のすべての子 sold を合計する必要があります列も。だから私はこのようなクエリを使用しようとしました:

SELECT
    p1.id,
    SUM(p2.sold) + p1.sold AS sold
FROM products p1
JOIN products p2
    ON p2.parent = p1.id
WHERE p1.parent = 0;

しかし、私はこれを取得します:

|-----------|
| id | sold |
|-----------|
| 1  | 4    |
|-----------|

したがって、最初のレコードには子がありますが、4番目のレコードには子がありません。私の期待される結果はこれです:

|-----------|
| id | sold |
|-----------|
| 1  | 4    |
| 4  | 2    |
|-----------|

回答 4 件
  • あなたは subquery が欲しい  :

    select id, sum(sold) +
               ( select coalesce(sum(p1.sold), 0)
                 from products p1
                 where p1.parent = p.id
               ) as sold
    from products p
    where parent = 0
    group by id;
    
    

  • 私は left join をお勧めします  および group by

    SELECT p1.id,
           (COALESCE(SUM(p2.sold), 0) + p1.sold) AS sold
    FROM products p1 LEFT JOIN
         products p2
         ON p2.parent = p1.id
    GROUP BY p1.id, p1.sold;
    
    

    あなたは NULL に注意する必要があります  子を持たない親の値。

  • これは動作するはずです:

    select a.id, sum(a.sold+coalesce(b.sold,0)) from products a left join(
    select parent, sum(sold) sold
    from products group by parent) b on a.id=b.parent
    where a.parent=0
    group by a.id
    
    

  • それを左外部結合にし、null値を0に変更して、合計がnullにならないようにします。

    SELECT
        p1.id,
        SUM(COALESCE(p2.sold,0)) + p1.sold AS sold
    FROM products p1
    LEFT JOIN products p2
        ON p2.parent = p1.id
    WHERE p1.parent = 0
    GROUP BY p1.id;
    
    

    前述のように、このソリューションは複数レベルの子を処理しません。

    SQLFiddleのライブデモ

あなたの答え