0

SQL フィドル -> http://sqlfiddle.com/#!2/28938/9

次のようなテーブルがあります。

+------+----------+--------+
|  id  | group_id | letter |
+------+----------+--------+
|  1   | 44       | a      |
|  2   | 55       | a      |
|  3   | 44       | b      |
|  4   | 55       | c      |
|  5   | 44       | c      |
|  6   | 55       | d      |
+------+----------+--------+

そして、2 つ以上の数に加えて、その文字を持つ両方の group_id を持つ文字を選択したいと考えています。私が取り組んでいるクエリは次のとおりです。

SELECT b.id AS idx, a.id AS idy, a.letter FROM (
  SELECT id, letter, COUNT(1) AS count
  FROM temp WHERE group_id = 55
  OR group_id = 44
  GROUP BY letter
) AS a
JOIN temp AS b ON a.letter = b.letter
WHERE a.count > 1
AND group_id = 55

ここに私の望ましい結果があります:

+-----+-----+--------+
| idx | idy | letter |
+-----+-----+--------+
| 2   | 1   | a      |
| 4   | 5   | c      |
+-----+-----+--------+

しかし、残念ながら、これは私が得ているものです

+-----+-----+--------+
| idx | idy | letter |
+-----+-----+--------+
| 2   | 1   | a      |
| 4   | 4   | c      |
+-----+-----+--------+

ID が正しい列にあることを保証するにはどうすればよいですか?

ありがとうございました!

4

1 に答える 1

0

これはレイアウトに関してあなたが望むものではありませんが、4 つのフィールドを返します。内部クエリの結果が ID #5 にならないため、上記のクエリは機能しません。以下の変更されたクエリはそれを行いますが、ハッキーに感じます。

SELECT
      MAX(IF (b.group_id = 55, b.id, -1)) as idx,
      MAX(IF (b.group_id = 44, b.id, -1)) as idy,
      b.letter
FROM 
  temp b

INNER JOIN (
  SELECT 
      letter, group_id, COUNT(1) AS count
    FROM temp WHERE group_id = 55
    OR group_id = 44
    GROUP BY letter
    HAVING count > 1
  ) a ON (b.letter = a.letter)

GROUP BY letter
于 2013-10-08T21:47:58.757 に答える