0

私の質問のタイトルを許してください。何を入れるべきかわかりません。以下の2つの表があります。

products                orders
+------+----------+     +--------+------+-------+
|  id  | name     |     |   id   |  qty |  pid  |
+------+----------+     +--------+------+-------+
|  1   | mouse    |     | 10001  |  20  |   1   |
|  2   | keyboard |     | 10002  |  15  |   3   |
|  3   | headset  |     | 10004  |  5   |   3   |
+------+----------+     | 10005  |  12  |   2   | 
                        | 10006  |  18  |   1   |
                        +--------+------+-------+

これは私が使用しているLEFT JOINクエリと出力です

SELECT p.id AS No, p.name AS ProductName, o.qty AS Quantity
FROM products AS p
LEFT JOIN orders AS o ON p.id = o.pid

+------+-------------+----------+
|  No  | ProductName | Quantity |
+------+-------------+----------+
|  1   | mouse       |   20     |
|  1   | mouse       |   18     |
|  2   | keyboard    |   12     | 
|  3   | headset     |   15     |
|  3   | headset     |    5     |
+------+-------------+----------+

私が達成しようとしているのは、以下のような出力です。

+------+-------------+----------+
|  No  | ProductName | Quantity |
+------+-------------+----------+
|  1   | mouse       |   20     |
|      |             |   18     |
|  2   | keyboard    |   12     | 
|  3   | headset     |   15     |
|      |             |    5     |
+------+-------------+----------+

私の質問は可能ですか?返信や提案は大歓迎です。ありがとう。

P/S: GROUP_CONCAT(qty SEPARATOR ",") も使用してみましたが、今後 Orders テーブルに追加する列が増える可能性があり、読みにくくなるため、結果は 1 行で返されます。

4

2 に答える 2

2

もちろん、それは可能です — 変数を使用する必要はありません:

SELECT    IF(c.min_oid IS NOT NULL, a.id,   NULL) AS No,
          IF(c.min_oid IS NOT NULL, a.name, NULL) AS ProductName,
          b.qty AS Quantity
FROM      products a
JOIN      orders b ON a.id = b.pid
LEFT JOIN (
          SELECT   MIN(id) AS min_oid
          FROM     orders
          GROUP BY pid
          ) c ON b.id = c.min_oid
ORDER BY  a.id,
          b.id

基本的に、行が特定の製品の最小注文 ID でない場合は空白 (NULL) を表示し、それ以外の場合は情報を表示します。


SQLFiddle デモ

于 2012-08-05T07:43:05.910 に答える
1

In this case you can use MySQL variables. I store the previous product id in the variable @prev, and only if it changes we output the product name.

http://www.sqlfiddle.com/#!2/d5fd6/9

SET @prev := NULL;

SELECT
  IF( @prev = p.id, NULL, p.id) AS No,
  IF( @prev = p.id, NULL, p.name) AS ProductName,
  o.qty AS Quantity
 ,@prev := p.id

FROM products AS p

LEFT JOIN orders AS o
       ON p.id = o.pid
于 2012-08-05T07:49:03.583 に答える