2010-01-25 8 views
2

3 표를 얻기 위해 조인 다운로드 테이블에서이 항목의 발생 횟수와 해당 항목과 관련된 모든 tag_name 값과 함께 단일 항목을 어떻게 선택합니까?선택은 수와 연결된 문자열

는 시도 :

SELECT 
    ..., 
    COUNT(downloads.item_id) AS download_count, 
    GROUP_CONCAT(tags.tag_name SEPARATOR ":") AS tags 
FROM items 
LEFT JOIN tags ON items.item_id = tags.item_id 
LEFT JOIN downloads ON items.item_id = downloads.item_id 
WHERE items.item_id = 123 

이 작동하지 않습니다. 태그를 여러 번 반환합니다. "다운로드"테이블에있는 항목의 발생 횟수만큼이나 많습니다.

답변

4

downloads 사이에 Cartesian product을 생성 했으므로 배수가 늘어나는 것은 놀라운 일이 아닙니다.

이 시도 :

SELECT 
    ..., 
    COUNT(DISTINCT downloads.download_id) AS download_count, 
    GROUP_CONCAT(DISTINCT tags.tag_name SEPARATOR ":") AS tags 
FROM items 
LEFT JOIN tags ON items.item_id = tags.item_id 
LEFT JOIN downloads ON items.item_id = downloads.item_id 
WHERE items.item_id = 123 

그러나, 나는 두 개의 쿼리에이 일을 권하고 싶습니다. 단일 쿼리에서 모든 것을 할 필요가 없습니다, 때로는 두 개의 간단한 쿼리를 실행하는 데 더 빠르다 :

SELECT 
    ..., 
    COUNT(*) AS download_count, 
FROM items 
LEFT JOIN downloads ON items.item_id = downloads.item_id 
WHERE items.item_id = 123 

SELECT 
    GROUP_CONCAT(tags.tag_name SEPARATOR ":") AS tags 
FROM items 
LEFT JOIN tags ON items.item_id = tags.item_id 
WHERE items.item_id = 123 
+0

이 나는 ​​또한 내가 2 개 쿼리 대신 1을 사용할지 여부를 궁금로 내 두 질문에 대한 답변을 문제의 데이터를 얻는다. 고맙습니다! –

관련 문제