자체 조인 없이이 쿼리를 수행하는 영리한 방법을 찾았습니다.
Windows 용 MySQL 5.5.8에서 이러한 명령을 실행 한 결과는 다음과 같습니다.
use test
DROP TABLE IF EXISTS answers;
CREATE TABLE answers (user_id VARCHAR(10),question_id INT,answer_value VARCHAR(20));
INSERT INTO answers VALUES
('Sally',1,'Pouch'),
('Sally',2,'Peach'),
('John',1,'Pooch'),
('John',2,'Duke');
INSERT INTO answers VALUES
('Sally',1,'Pooch'),
('Sally',2,'Peach'),
('John',1,'Pooch'),
('John',2,'Duck');
SELECT user_id,question_id,GROUP_CONCAT(DISTINCT answer_value) given_answers
FROM answers GROUP BY user_id,question_id;
+---------+-------------+---------------+
| user_id | question_id | given_answers |
+---------+-------------+---------------+
| John | 1 | Pooch |
| John | 2 | Duke,Duck |
| Sally | 1 | Pouch,Pooch |
| Sally | 2 | Peach |
+---------+-------------+---------------+
이 화면은 요한이 질문 2에 대해 서로 다른 두 가지 답변을했으며, 샐리는 질문 1에 대해 서로 다른 두 가지 답변을 주었다는 것을 보여줍니다.
모든 사용자가 다르게 답변 한 질문을 찾으려면 위 쿼리를 하위 쿼리에 넣고 주어진 답변 목록에서 쉼표를 확인하여 다음과 같이 고유 한 답변 수를 얻으십시오.
SELECT user_id,question_id,given_answers,
(LENGTH(given_answers) - LENGTH(REPLACE(given_answers,',','')))+1 multianswer_count
FROM (SELECT user_id,question_id,GROUP_CONCAT(DISTINCT answer_value) given_answers
FROM answers GROUP BY user_id,question_id) A;
알 겠어:
+---------+-------------+---------------+-------------------+
| user_id | question_id | given_answers | multianswer_count |
+---------+-------------+---------------+-------------------+
| John | 1 | Pooch | 1 |
| John | 2 | Duke,Duck | 2 |
| Sally | 1 | Pouch,Pooch | 2 |
| Sally | 2 | Peach | 1 |
+---------+-------------+---------------+-------------------+
이제 다른 하위 쿼리를 사용하여 multianswer_count = 1 인 행을 필터링하면됩니다.
SELECT * FROM (SELECT user_id,question_id,given_answers,
(LENGTH(given_answers) - LENGTH(REPLACE(given_answers,',','')))+1 multianswer_count
FROM (SELECT user_id,question_id,GROUP_CONCAT(DISTINCT answer_value) given_answers
FROM answers GROUP BY user_id,question_id) A) AA WHERE multianswer_count > 1;
이것이 내가 얻은 것입니다 :
+---------+-------------+---------------+-------------------+
| user_id | question_id | given_answers | multianswer_count |
+---------+-------------+---------------+-------------------+
| John | 2 | Duke,Duck | 2 |
| Sally | 1 | Pouch,Pooch | 2 |
+---------+-------------+---------------+-------------------+
기본적으로 세 개의 테이블 스캔을 수행했습니다. 하나는 기본 테이블에서, 다른 하나는 작은 하위 쿼리에서. 조인 없음!
시도 해봐 !!!