2012-03-23 3 views
0

나는 '태그'시스템을 구축 중입니다. 태그 시스템이 아니기 때문에 충분히 인용했지만동적 양을 기준으로 데이터베이스를 쿼리하는 중

분명히 태그를 처리 할 때 사용자는 여러 태그를 매우 잘 사용하고 결과를 더 큰 깊이로 필터링 할 것을 기대할 수 있습니다.

내가 겪고있는 문제는 정확히 어떻게 해야하는지입니다.

나는 지금까지 그것을 할 수 있다고 생각할 수있는 두 가지 방법이 있지만 거기에있는 누군가가 올바른 방법을 설명 할 수 있다면 크게 감사 할 것입니다.

way 1) 각 태그에 대해 개별 쿼리를 수행 한 후 데이터를 정렬/결합/재생합니다. 방법 2)

SELECT i2t.item_id 
FROM Item2Tag i2t 
INNER JOIN Tag t 
ON i2t.tag_id = t.tag_id 
WHERE t.tag_text IN ('beach','cloud','waves') 
GROUP BY i2t.item_id 

위의 내용은 저의 쿼리입니다. 이는 Toxi 솔루션의 수정 버전을 기반으로합니다. 바라건대 당신은 무슨 일이 진행되고 있는지 본다. 본질적으로 3 개의 테이블, 정보를위한 1, 태그를위한 1, 그리고 그들을 연결하는 또 다른 테이블이있다.

이것은 현재 내가하고있는 일입니다. 나는 '해변', '구름', '파도'를 변수로 대체합니다. 그런 다음 PHP 코드 내에서 배열을 쉼표로 구분 된 문자열로 변환하고 단순히 쿼리에 삽입합니다. 그래서 뭔가 같은 : 내가 올바르게 comma..but없이 마지막 태그를 종료 할 필요가 있기 때문에, 조금 단순화를 통해 물론이다

foreach ($tagarray as $tag){ 
$string = .$tag1.", " } 

희망 당신은 점을 얻는다.

때문에, $ 문자열은이 작업을 수행 할 수있는 더 나은 방법이 있나요 '이 tag1, tag2로, TAG3'

SELECT i2t.item_id 
FROM Item2Tag i2t 
INNER JOIN Tag t 
ON i2t.tag_id = t.tag_id 
WHERE t.tag_text IN ('$string') 
GROUP BY i2t.item_id 

동일하게?

+0

이 결과를 얻는 방법은 여러 가지가 있습니다. [has-many-through 관계로 SQL 결과를 필터링하는 방법] (http://stackoverflow.com/questions/7364969/how-to-filter-sql- 많은 결과를 통해 많은 결과를 얻음), 몇 가지 테스트도 있습니다. –

답변

2

데이터베이스 구조는 이러한 3 개의 테이블에 적합합니다. 하지만 쿼리에 약간의 문제가 있습니다. 문법 하나가 아닙니다. 예를 들어 봅시다. 사용자는 'a'및 'b'태그가있는 콘텐츠를 검색합니다. 'a'태그가있는 콘텐츠가 있으면 결과로 표시됩니다. 또한 'b'태그가있는 콘텐츠. 당신은 같은 쿼리를 추가해야합니다

HAVING COUNT (t.tag_id를) = X

(당신 (3) 내 예 2) x는 당신이 쿼리하는 태그의 수의 길이가

, . 주어진 세트의 모든 항목이 일치하면 콘텐츠는 결과로 간주됩니다. 이 테이블에 중복 항목이없는 경우에만 작동합니다.

또한 루프 대신 implode를 사용하십시오.

$string = implode(",", $tagarray); 

이렇게하면 마지막 쉼표를 제거 할 필요가 없습니다.

+0

아 웃겨. 나는 내 붕괴를 잊어 버린 것을 믿을 수 없다. 감사! 그리고 나는 확실히 값을 더할 것이다. 다시 한 번 감사드립니다! –

관련 문제