[SQL] MySQL은 : 어떻게 특정 값을 갖는 그룹을 선택하려면?
SQLMySQL은 : 어떻게 특정 값을 갖는 그룹을 선택하려면?
말 같은 테이블이 있습니다 :
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.가없는 경우 고유 제약 조건이 시도 :
가없는 경우 고유 제약 조건이 시도 :
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.당신은 자기가 가입 시도 할 수 (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.나는 다른 테이블에 대한 몇 가지 가정을했습니다. (즉, 당신이 내가 게시물 / 태그 테이블이있는 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.
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.방법에 대한
방법에 대한
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.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
from https://stackoverflow.com/questions/3083409/mysql-how-to-select-groups-having-certain-values by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 오라클 (? 오래) 조인 - 변환을위한 도구 / 스크립트를? (0) | 2020.04.22 |
---|---|
[SQL] 화합물 키 행 그룹당 시리얼 번호 (0) | 2020.04.21 |
[SQL] 치명적인 오류 : catch되지 않은 예외 메시지 'mysqli_sql_exception' '질의 / 준비된 문에 사용 된 인덱스' (0) | 2020.04.21 |
[SQL] DB2 SQL에서 정규 표현식 (0) | 2020.04.21 |
[SQL] MySQL의 트리거 저장 트리거는 이미 저장 트리거를 호출 문에 의해 사용됩니다 (0) | 2020.04.21 |