SELECT ID, title, image, FROM items WHERE ID IN (
SELECT tags_relationships.post_id
FROM tags_relationships
INNER JOIN tags
ON tags.tag_id = tags_relationships.tag_id
WHERE tags.name = 'white'
)
AND
ID IN (
SELECT tags_relationships.post_id
FROM tags_relationships
INNER JOIN tags
ON tags.tag_id = tags_relationships.tag_id
WHERE tags.name = 'bike'
)
AND status = 'publish' ORDER BY ID DESC LIMIT 1860,20
嗨,再次。 当有人搜索“白色自行车”时,我有这个问题,结果很好,倾倒所有物品,白色和自行车标签。 这个查询的问题是花费太多时间> 2秒,因为items表有大约200k行和tags_relationships大约1.5 mil行。 我已经尝试过处理索引,但我知道我的查询应该采用类似的方法,以便更快地进行审讯。
答案 0 :(得分:2)
等效查询 *如果tags_relationships具有唯一的对(post_id,tag_id)
SELECT items.* FROM items
INNER JOIN tags_relationships r1 ON (r1.post_id = items.id)
INNER JOIN tags_relationships r2 ON (r2.post_id = items.id)
INNER JOIN tags t1 ON (t1.tag_id = r1.tag_id)
INNER JOIN tags t2 ON (t2.tag_id = r2.tag_id)
WHERE
t1.name = 'white'
AND t2.name = 'bike'
AND items.status = 'publish'
ORDER BY ID DESC
但是,它完全等效,包括执行计划,因为'IN(子查询)'构造在唯一连接字段的情况下是内连接本身。 tags_relationships的主键或唯一索引应该是复杂的(post_id,tag_id)。
答案 1 :(得分:0)
这个怎么样,
SELECT
ID,
title,
image
FROM items
WHERE
ID IN
(
SELECT tags_relationships.post_id
FROM tags_relationships
INNER JOIN tags
ON tags.tag_id = tags_relationships.tag_id
WHERE tags.name IN ('white') AND tags.name IN ('bike')
)
AND status = 'publish'
ORDER BY ID DESC
LIMIT 1860,20