9

そのようなテーブルがあるとしましょう:

mysql> SELECT * FROM tags;
+---------+--------+
| post_id | tag_id |
+---------+--------+
|       1 |      2 |
|       1 |      3 |
|       1 |      1 |
|       2 |      1 |
|       2 |      2 |
+---------+--------+
5 rows in set (0.00 sec)

フィールド名はかなり自明です。post_id1と3の両方を持つを選択したいtag_idので、この例ではそれだけ1です。このグループに存在するSELECT post_id FROM tags GROUP BY post_id HAVING ...をリストしたいのですが、次のようなことを考え ました。tag_idそれ、どうやったら出来るの?

4

6 に答える 6

14

一意の制約がない場合は、次を試してください。

SELECT post_id 
FROM tags 
WHERE tag_id = 1 OR tag_id = 3 
GROUP BY post_id 
HAVING count(DISTINCT tag_id) = 2;

または、2 つの値HAVINGのみを検出しようとする場合は、次の句を使用します。tag_id

HAVING MIN(tag_id) <> MAX(tag_id)

post_id と tag_id の両方に一意の制約がある場合、これも機能するはずです。

SELECT post_id 
FROM tags 
WHERE tag_id = 1 OR tag_id = 3 
GROUP BY post_id 
HAVING count(*) = 2;
于 2010-06-21T09:47:03.527 に答える
3

自己結合 (N tag_id -> N 結合) を試すこともできますが、おそらく高速ではありません

SELECT t1.post_id 
FROM tags t1 INNER JOIN tags t2 ON t1.post_id = t2.post_id 
WHERE t1.tag_id = 1 AND t2.tag_id = 3
于 2010-06-21T09:34:49.220 に答える
2
SELECT post_id
  FROM ( SELECT post_id,
                count(tag_id) AS counter
           FROM tags
          WHERE tag_id IN (1,3)
          GROUP BY post_id
       )
 WHERE counter = 2

質問の 2 番目の部分には GROUP_CONCAT() を使用します

SELECT post_id,
       GROUP_CONCAT(tag_id ORDER BY tag_id ASC SEPARATOR ',')
  FROM tags
于 2010-06-21T09:44:29.010 に答える
1

私はあなたの他のテーブルについていくつかの仮定をしました。(つまり、私が呼び出した投稿のテーブルと、すでに呼び出している投稿/タグ テーブルとの名前衝突を避けるためにposts呼び出した PK としてtag_id を持つテーブルがあること)tag_tabletags

対応する post_id/tag_id を持つ一致するレコードが存在しないリスト {1,3} にタグが存在しない投稿が必要なため、以下のように二重の NOT EXISTS 構造を使用できます。

SELECT post_id
FROM posts p
WHERE NOT EXISTS 
    (SELECT * FROM tag_table tt
    WHERE tag_id IN (1,3)
    AND NOT EXISTS
        (SELECT * FROM tags t
        WHERE t.tag_id = tt.tag_id  and
        p.post_id = t.post_id)        
    )

もう 1 つの代替アプローチは、Group By と Count を使用することです。この問題へのアプローチのレビューはここにあります

于 2010-06-21T09:32:06.237 に答える
0

どうですか

SELECT * 
FROM tags 
WHERE post_id in 
  (SELECT post_id AS pid 
   FROM tags 
   WHERE 1 IN (SELECT tag_id FROM tags WHERE post_id = pid) 
   AND 3 IN (SELECT tag_id FROM tags WHERE post_id = pid)
  );
于 2010-06-21T09:34:57.830 に答える
0

@Keeper のソリューションの WHERE バージョン

SELECT DISTINCT t1.post_id 
FROM tags t1, tags t2
WHERE 
  t1.post_id = t2.post_id  AND 
  t1.tag_id = 1 AND t2.tag_id = 3
于 2010-06-21T09:41:41.783 に答える