3

私は単一のテーブルを持っています。

id   title     value
1    title_a    value_z
1    title_a    value_y
1    title_a    value_x

2    title_a    value_z
2    title_a    value_y
2    title_a    value_x

3    title_a    value_z
3    title_a    value_y
3    title_a    value_w

4    title_a    value_z
4    title_a    value_y

5    title_a    value_z
5    title_a    value_y
5    title_a    value_x
5    title_a    value_w

戻りたい:

1    title_a
3    title_a
4    title_a
5    title_a

つまり、GROUP BY id を使用したいのですが、まったく同じ「値」のセットを持つグループを除外します。(ID 1 と 2 は同じ値 x、y、z を持っているため、それらを 1 つの結果にグループ化します)。タイトルは今のところ関係ありません。

答えはとても簡単に視覚化できますが、私の人生では、クエリの書き方を理解することはできません。想像できるすべての GROUP BY、DISTINCT、およびサブクエリを試しましたが、ID でグループ化するとすぐに、「値」セットの一意性を確認する方法がないようです。

私を助けてください、スタックオーバーフロー、あなたは私の唯一の希望です...

4

1 に答える 1

2

を使用して、各 IDGROUP_CONCATを平坦化できます。value

SELECT
  id,
  title,
  GROUP_CONCAT(DISTINCT value ORDER BY value) AS AllValues
FROM myTable
GROUP BY id, title

結果は次のようになります。

  id     title     AllValues                        
 ------ --------- --------------------------------- 
     1   title_a   value_x,value_y,value_z          
     2   title_a   value_x,value_y,value_z          
     3   title_a   value_w,value_y,value_z          
     4   title_a   value_y,value_z                  
     5   title_a   value_w,value_x,value_y,value_z  

これをサブクエリに入れてMIN、 ID の と のMINを取得し、titleでグループ化するAllValuesと、目的の結果が得られます。

SELECT
  MIN(id) AS MinID,
  MIN(title) AS MinTitle
FROM (
  SELECT
    id,
    title,
    GROUP_CONCAT(DISTINCT value ORDER BY value) AS AllValues
  FROM myTable
  GROUP BY id, title
) FlattenTitles
GROUP BY AllValues
ORDER BY MinID

MINタイトルの は推測であることに注意してください。title値が異なる場合にどちらが選択されるかを決定する他のロジックがある場合があります。

このクエリをテストし、SQL Fiddle として追加しようとしましたが、SQLFiddle サイトで奇妙なエラーが発生し、ここでは自宅では取得できませんでした。

于 2013-06-19T13:48:43.643 に答える