저는 Postgresql을 사용하고 있습니다. 항목 테이블, 태그 테이블 및 항목과 많은 태그를 연결하는 테이블이 있습니다. 2 개 (또는 그 이상)의 태그와 일치하는 항목을 선택해야합니다.조인 된 테이블에서 둘 이상의 값이 주어진 세트와 일치하는 위치 선택
WHERE tag.name IN ('tag1', 'tag2')
과 1을 초과하는 항목을 선택할 수 있습니다. MySQL에서 나는 WHERE x IN ALL (y, z)
이라고 말할 수 있다고 생각하지만 작동하지 않습니다. pgsql입니다.
지금까지 내가 가진 최선의 방법은 하위 쿼리를 사용하여 두 테이블을 두 번 결합하는 것입니다. 이것은 분명히 많은 태그에서의 매칭에 맞지 않을 것이고 나는 가장 효율적인 접근법이 아닐 것이라고 확신합니다.
SELECT *
FROM item
JOIN (SELECT item.id FROM item
JOIN tagged on tagged.item=item.id
JOIN tag ON tag.id=taged.tag
WHERE tag.name='tagOne') p ON p.id=item.id
JOIN tagged ON tagged.item=item.id
JOIN tag ON tag.id=tagged.tag
WHERE tag.name='tagTwo'`
편집 : 난 아직도 물건을 테스트하지만, 하위 쿼리에서 이것을 사용하고 나의 위의 시도보다 더 나은 작동
SELECT item.id, count(tag2) AS relevance
FROM item
JOIN tagged tagged1 ON tagged1.item=item.id
JOIN tag tag1 ON (tag1.id=tagged1.tag AND tag1.name='tag1')
JOIN tagged tagged2 ON tagged2.item=item.id
JOIN tag tag2 ON (tag2.id=tagged2.tag)
WHERE tag2.name IN ('tag2', 'tag3')
GROUP BY item.id
여기에 요청 명확한 설명을 위해 일부 테이블 정의를의로 :
CREATE TABLE item (id serial, [...]);
CREATE TABLE tag (id serial, name string UNIQUE);
CREATE TABLE taged (tag int references tag(id), item int references item(id));
참조 http://stackoverflow.com/questions/2161588/what-mysql-query-should-i-use-to-select-a-category-that-matches-all-my-criteria –
나는 그렇지 않습니다. 'x ALL ALL (y, z)'가 MySQL에서 생각하는 것을 수행한다고 생각하십시오. 당신이 생각하고있는 것을 정확하게 볼 수 있도록 MySQL 예제를 제공 할 수 있습니까? –
테이블/열 이름 지정이 다소 혼란스러운 경우 테이블 정의를 추가하면 질문이 향상됩니다. –