복붙노트

[SQL] MySQL은 : 어떻게 특정 값을 갖는 그룹을 선택하려면?

SQL

MySQL은 : 어떻게 특정 값을 갖는 그룹을 선택하려면?

말 같은 테이블이 있습니다 :

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)

필드 이름은 별다른 설명이 있습니다. 그래서이 예제에서는 단지 1. 내가 좋아하는 뭔가 생각입니다, 모두 1 개 3 tag_ids이 post_ids을 선택합니다 SELECT 내가이 그룹에 존재하는 목록 tag_ids 싶습니다 후에 ... GROUP BY 데 POST_ID 태그로부터 POST_ID. 어떻게 그렇게 할 수 있습니까?

해결법

  1. ==============================

    1.가없는 경우 고유 제약 조건이 시도 :

    가없는 경우 고유 제약 조건이 시도 :

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

    두 tag_id 값을 감지하려고하는 경우 또는이 HAVING 절을 사용합니다 :

    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;
    
  2. ==============================

    2.당신은 자기가 가입 시도 할 수 (N은 tag_id -> N 가입)하지만 아마 빠른 아니다

    당신은 자기가 가입 시도 할 수 (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
    
  3. ==============================

    3.나는 다른 테이블에 대한 몇 가지 가정을했습니다. (즉, 당신이 내가 게시물 / 태그 테이블이있는 nameclash을 피하기 위해 tag_table라고 한 PK로 tag_id으로 게시물 하나라는 것을 게시물에 대한 테이블을 가지고 내가 당신에게 이미 전화 태그를 볼 수)

    나는 다른 테이블에 대한 몇 가지 가정을했습니다. (즉, 당신이 내가 게시물 / 태그 테이블이있는 nameclash을 피하기 위해 tag_table라고 한 PK로 tag_id으로 게시물 하나라는 것을 게시물에 대한 테이블을 가지고 내가 당신에게 이미 전화 태그를 볼 수)

    와 일치하는 레코드가 존재하지 않는 당신은 목록 {1,3}에서 태그가 존재하지 않는 게시물을 원하는 post_id를 / tag_id 당신은 두 번 사용할 수 있도록 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)        
        )
    

    또 다른 방법은 그룹으로 사용하고 카운트하는 것입니다. 이 문제에 대한 접근 방법의 검토는 여기에있다.

  4. ==============================

    4.

    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
    

    질문의 두 번째 부분에 대한 사용 GROUP_CONCAT ()

    SELECT post_id,
           GROUP_CONCAT(tag_id ORDER BY tag_id ASC SEPARATOR ',')
      FROM tags
    
  5. ==============================

    5.방법에 대한

    방법에 대한

    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)
      );
    
  6. ==============================

    6.WHERE 버전의 파수꾼의 솔루션 @

    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
    
  7. from https://stackoverflow.com/questions/3083409/mysql-how-to-select-groups-having-certain-values by cc-by-sa and MIT license