문제

태그 구현을위한 스키마가 주어졌습니다

항목 itemid, itemcontent

태그 태그, 태그 이름

item_tag itemid, tagid

태그로 선택할 때 반환 할 항목 수를 제한하는 가장 좋은 방법은 무엇입니까?

SELECT i.ItemContent, t.TagName FROM item i 
INNER JOIN ItemTag it ON i.id = it.ItemId 
INNER JOIN tag t ON t.id = it.TagId 

물론 모든 것을 되 찾는 가장 쉬운 방법이지만 한계 조항을 사용하면 각 태그의 모든 항목의 복제본이 제한되는 행의 수에 계산되기 때문에 한계 조항이 분해됩니다.

도움이 되었습니까?

해결책

두 번째 솔루션은 MySQL 기능 Group_Concat ()을 사용하여 항목과 일치하는 모든 태그를 결과 세트의 쉼표로 구분 된 문자열로 결합합니다.

SELECT i.ItemContent, GROUP_CONCAT(t.TagName ORDER BY t.TagName) AS TagList
FROM item AS i 
  INNER JOIN ItemTag AS it ON i.id = it.ItemId 
  INNER JOIN tag AS t ON t.id = it.TagId
GROUP BY i.ItemId;

Group_Concat () 함수는 MySQL 기능이며 표준 SQL의 일부가 아닙니다.

다른 팁

어쩌면

select i.ItemContent, t.TagName from (SELECT ItemId, ItemContent FROM item limit 10) i
INNER JOIN ItemTag it ON i.ItemId = it.ItemId --You will miss tagless items here!
INNER JOIN tag t ON t.id = it.TagId

첫 번째 제안은 하위 쿼리를 사용하여 항목 ID 목록을 생성하고 해당 항목 ID와 일치하는 반환 항목을 생성하는 것입니다. 그러나 결과 세트에 태그 이름이 포함되지 않습니다. 다른 솔루션으로 별도의 답변을 제출하겠습니다.

SELECT i.ItemContent
FROM item AS i
WHERE i.id IN (
  SELECT it.ItemId
  FROM ItemTag AS it
    INNER JOIN tag AS t ON (t.id = it.TagId)
  WHERE t.TagName IN ('mysql', 'database', 'tags', 'tagging')
);

이것은 비 상관 서브 쿼리이므로 우수한 SQL 엔진은이를 고려하고 한 번만 실행해야합니다.

다음과 같은 별도의/그룹을 사용할 수도 있습니다.

SELECT DISTINCT TagID, TagName FROM ((TAG T INNER JOIN ITEM_TAG I_T ON T.TagID = I_T.TagID) INNER JOIN ITEM I ON I_T.ItemID = I.ItemID) GROUP BY TagID, TagName

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top