作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前的 MySQL 查询最多需要 10 秒才能在我的应用程序中运行:
SELECT tagid, tag FROM tags WHERE tagid IN
(SELECT DISTINCT tagid FROM news_tags WHERE newsid IN
(SELECT newsid FROM news_tags WHERE tagid IN (16,32)
GROUP BY newsid HAVING COUNT(newsid)>=2))
AND tagid NOT IN (16,32) ORDER BY level, tagid
使用的表格是:
news_tags
, 列 newsid
, tagid
tags
, 列 tagid
, tag
, level
查询的目的是查找带有 tagid
标记的“新闻”项目16 和 32,然后找到这些新闻条目也被标记的其他标签,目的是允许用户进一步缩小具有更具体标签组合的“新闻”条目。最终目标是抢到剩余的相关tag
和 tagid
来自 tags
的列表。
我已经尝试过不同的尝试,得到一个等价的 JOIN
但未能选择所有剩余的 tagid
s 在附加了提供的标签的新闻项目上。
这是我的 EXPLAIN
SQL 结果,以防它们指出我遗漏的另一个缓慢原因:
id|select_type |table |type |possible_keys|key |key_len|ref |rows|Extra 1|PRIMARY |tags |range |PRIMARY |PRIMARY| 4|NULL| 55|Using where; Using filesort 2|DEPENDENT SUBQUERY|news_tags|index_subquery|tagid |tagid | 4|func| 26|Using index; Using where 3|DEPENDENT SUBQUERY|news_tags|index |tagid |PRIMARY| 8|NULL| 11|Using where; Using index
只是为了澄清问题:我想要同时标记 16 和 32 标签的新闻项目的剩余标签,而不是 16 或 32。抱歉造成任何混淆。
最佳答案
SELECT DISTINCT tags.tagid, tags.tag
FROM
tags -- tags from the ...
JOIN news_tags AS n0 USING (tagid) -- ... news items tagged with ...
JOIN news_tags AS n1 USING (newsid) -- ... tagid = 16 and ...
JOIN news_tags AS n2 USING (newsid) -- ... tagid = 32
WHERE
n1.tagid = 16 AND n2.tagid = 32
AND tags.tagid NOT IN (16,32) -- not the tags we already know about
ORDER BY tags.level, tags.tagid
关于mysql - 缓慢的 MySQL IN 查询——如何转换为 JOIN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10387795/
我是一名优秀的程序员,十分优秀!