-5

どうすればこのような結果を得ることができますか?

元:

id     |  name   |  locid
--------------------------
1      |  IND,UK |   1
       |  USA    |   2
       |  PAK    |   3
2      |  UAE    |   4
4

1 に答える 1

3

あなたが私たちに与えてくれたもので、望ましい結果セットのサンプルにすぎないので、私は提案に抵抗することはほとんどできません:

SELECT '1' AS `id`, 'IND,UK' AS `name`, '1' AS locid
UNION ALL SELECT '', 'USA', '2'
UNION ALL SELECT '', 'PAK', '3'
UNION ALL SELECT '2', 'UAE', '4'

さて、結局、私はそれを提案することに抵抗できなかったことがわかりました.

しかし、それはあなたが尋ねていた質問に答えていないと確信しています。

ここであなたのテーブル構造を推測しているだけです。しかし、与えられた:

CREATE TABLE mytable (id INT, locid INT, `name` VARCHAR(3));
INSERT INTO mytable VALUES (1,1,'IND'),(1,1,'UK'),(1,2,'USA'),(1,3,'PAK'),(2,4,'UAE');

このステートメントは、指定された結果セットを返します。

SELECT IF(u.id_break=1,u.id,'') AS id
     , u.name
     , u.locid
  FROM ( SELECT IF(t.id = @last_id,0,1) AS id_break
              , @last_id := t.id AS id
              , t.locid
              , t.name
           FROM ( SELECT s.id, s.locid, GROUP_CONCAT(s.name) AS `name`
                    FROM mytable s
                   GROUP BY s.id, s.locid
                   ORDER BY s.id, s.locid
                ) t
           JOIN (SELECT @last_id := NULL) i
          ORDER BY t.id, t.locid
       ) u

ここで、ラベルが付けられた列の「欠落」値はid実際には欠落していないと推測していますが、それは抑制されており、レポートのコントロール ブレークのようなものです。

私が提供したSQLステートメントは規範的なパターンではないことに注意してください。クエリの結果セットは別のクエリの行セットとして使用できるため、各行で繰り返される値を「取り除く」という考えは、関係モデル。

通常、このタイプの操作 (繰り返される値を「コントロール ブレーク」または「見出し」に変える) は通常、レポート作成レイヤーで処理され、結果セットを取得する SQL では処理されません。

後続の行で繰り返される id 値を削除する必要がない場合、クエリはより簡単になります。

SELECT t.id
     , t.locid
     , t.name
  FROM ( SELECT s.id, s.locid, GROUP_CONCAT(s.name) AS `name`
           FROM mytable s
          GROUP BY s.id, s.locid
          ORDER BY s.id, s.locid
       ) t
 ORDER BY t.id, t.locid

これがあなたに役立つかどうかはわかりません。あなたの質問に対する答えである限り、あなたの質問はあまりにも漠然としています。

于 2012-07-03T18:15:57.377 に答える