0

我的查询有问题,谁在 2 秒内运行。因为子查询返回 600 行,所以我需要没有 IN 运算符的查询或更快的查询。

目前,我有这个查询:

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

我想对 sql 说:“获取与 Javascript 标记(交叉约束)相关的其他标记,例如 stackoverflow。”

我有 3 个表:问题、任务标签和标签。问题和标签与 questtag 表相关。

Sql 架构:


问题(idquestion,问题):

1、《Javascript与Jquery》

2、《HTML、CSS、Javascript》

……


QUESTTAG(#idquestion,#idtag):

1, 1

1, 2

2、3

2、4

2, 1

……


QUESTTAG(#idtag,标签):

1、Javascript

2、jQuery

3、HTML

4、CSS

……


使用Javascript,我必须获得Jquery、HTML、CSS。使用Javascript, HTML,我必须得到CSS

4

1 回答 1

2

如果您像这样构建查询,您可能会有更好的运气:

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

或者你可能不会。无论如何,值得一试。

于 2013-06-02T12:33:45.827 回答