2013-06-02 3 views
1

2 초 후에 실행되는 쿼리에 문제가 있습니다. 하위 쿼리는 600 행을 반환하므로 IN 연산자 또는 빠른 쿼리없이 쿼리가 필요합니다. 내가 SQL에 말을 할교차로 제약 조건을 높이기 위해 다른 태그를 어떻게 얻습니까?

SELECT tag.idtag, tag, COUNT(*) AS nombre 
FROM tag, questtag 
WHERE tag.idtag = questtag.idtag 
    AND idquestion IN (
     SELECT question.idquestion 
     FROM question, questtag 
     WHERE question.idquestion = questtag.idquestion AND idtag IN (1) 
     GROUP BY question.idquestion 
     HAVING COUNT(*) = 1 
) 
GROUP BY tag 
ORDER BY nombre DESC, tag 
LIMIT 0, 24 

:

현재,이 쿼리가 ". 다른 태그 자바 스크립트 태그 (교차 제약)과 관련이하기에 유래와 같은" 을

나는 question, questag 및 tag 테이블이 3 개 있습니다. 질문 및 태그는 questtag 테이블과 관련이 있습니다.

는 SQL 스키마 :


질문 (idquestion, 질문) :

1 , "자바 스크립트와 jQuery를"

2, "HTML, CSS, 자바 스크립트"

....


QUESTTAG (#idquestion, #idtag)

1,1-

1,2

2,3

2,4-

2,1

....

01 23,516,

QUESTTAG (#idtag, 태그) :

1, 자바 스크립트

2, JQuery와

3, HTML

4, CSS

....


자바 스크립트이면 Jquery, HTML, CSS이 필요합니다. 자바로,, 나는 이되어야합니다. 이 같은 쿼리 구조의 경우

답변

1

당신은 더 좋은 행운이있을 수 있습니다 :

SELECT tag.idtag, tag, COUNT(*) AS nombre 
FROM tag join questtag on tag.idtag = questtag.idtag 
join (
     SELECT question.idquestion, COUNT(*) tags 
     FROM question q2 join questtag qt2 on q2.idquestion = qt2.idquestion 
     AND idtag IN (1) 
     GROUP BY question.idquestion 
) temp on temp.idquestion = questtag.idquestion 
WHERE tags = 1 
GROUP BY tag.idtag, tag 
ORDER BY nombre DESC, tag 
LIMIT 0, 24 

을하거나하지 않을 수 있습니다. 어쨌든 그것은 가치가 있습니다.

+0

** 미만 ** 4 ms **! :) –

관련 문제