문제

웹 사이트에 태그 지정 시스템을 구현하고 있습니다.개체 당 여러 태그가 있고 태그 당 여러 개체가 있습니다.이는 레코드 당 두 개의 값 (객체 및 태그의 ID에 대해 하나씩)이있는 테이블을 유지하여 수행됩니다.

주어진 태그 집합과 일치하는 개체를 찾기위한 쿼리를 작성하려고합니다.다음 데이터가 있다고 가정합니다 ([object]-> [tags] * 형식) 라코 디스

(빨간색) 맞추고 싶다면 사과와 소방차를 사야합니다.(과일, 음식) 맞추고 싶다면 (사과, 바나나)를 사야합니다.

SQL 쿼리를 작성하려면 어떻게해야합니까?

@Jeremy Ruten,

답변 해 주셔서 감사합니다.사용 된 표기법은 샘플 데이터를 제공하는 데 사용되었습니다. 제 데이터베이스에는 레코드 당 1 개의 개체 ID와 1 개의 태그가있는 테이블이 있습니다.

둘째, 내 문제는 모든 태그와 일치하는 모든 개체를 가져와야한다는 것입니다.OR을 AND로 대체 : 라코 디스

실행해도 결과가 없습니다.

도움이 되었습니까?

해결책

주어진 :

  • 개체 테이블 (기본 키 ID)
  • objecttags 테이블 (외래 키 objectId, tagid)
  • 태그 테이블 (기본 키 ID)

    SELECT distinct o.*
      from object o join objecttags ot on o.Id = ot.objectid
                    join tags t on ot.tagid = t.id
     where t.Name = 'fruit' or t.name = 'food';
    

    당신이 원하기 때문에 이것은 거꾸로 보입니다. 그러나 문제는 2 개의 태그가 같은 행에 있지 않다는 것입니다. 따라서 하나의 행은 과일과 음식이 될 수 없기 때문에 and는 아무것도 산출하지 않습니다. 이 쿼리는 태그 당 각 개체의 행 1 개를 얻으므로 일반적으로 중복을 생성합니다.

    정말로하고 싶다면이 경우에 group by가 필요하고 쿼리에 having count = <number of ors>가 필요합니다. 라코 디스

다른 팁

이런, 원래 댓글을 잘못 해석했을 수 있습니다.

SQL에서이를 수행하는 가장 쉬운 방법은 세 개의 테이블을 갖는 것입니다. 라코 디스

그런 다음 데이터에 대해 원하는 거의 모든 질문을 빠르고 쉽고 효율적으로 할 수 있습니다 (적절하게 색인을 생성 한 경우).멋지게 만들고 싶다면 여러 단어로 된 태그도 허용 할 수 있습니다 (우아한 방법이 있고 덜 우아한 방법이 있습니다).

이것이 당신이 가지고 있다고 가정하므로 아래 SQL이 작동합니다.

문자 그대로 : 라코 디스

다음과 같은 다른 방법도 있습니다. 라코 디스

@Kyle : 검색어는 다음과 비슷해야합니다. 라코 디스

쿼리가 태그가 과일과 음식 모두 인 행을 찾고 있었는데, 필드에 동시에 둘 다가 아니라 하나의 값만있을 수 있기 때문에 볼 수 없습니다.

Steve M.의 제안과 Jeremy의 제안을 결합하면 원하는 내용과 함께 단일 레코드를 얻을 수 있습니다. 라코 디스

지금은 확장 성이 좋지 않지만 원하는 것을 얻을 수 있습니다.코드에 큰 영향을주지 않으면 서 N 개의 일치하는 항목을 쉽게 가질 수 있도록이 작업을 수행하는 더 좋은 방법이 있다고 생각하지만 현재는 저를 피할 수 있습니다.

다음 스키마를 권장합니다. 라코 디스

다음 쿼리를 사용합니다. 라코 디스

다음과 같이 테이블에 레코드 당 1 개의 태그를 지정하는 것이 좋습니다. 라코 디스

그런 다음 라코 디스

정말 자신 만의 방식으로하고 싶다면 다음과 같이 할 수 있습니다. 라코 디스

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