我正在尝试使这个查询与 MySQL 兼容:
SELECT stories.*,
(SELECT id FROM models WHERE model_user_id = stories.user_id AND user_id = ? LIMIT 1)
AS c_model_id
FROM stories
WHERE
c_model_id IS NOT NULL
AND
EXISTS (
SELECT tag_id FROM stories_tags WHERE story_id = stories.id
INTERSECT
SELECT tag_id FROM models_tags WHERE model_id = c_model_id
)
我已经根据 this question 尝试了以下方法.
SELECT
stories.*,
(SELECT id FROM models WHERE model_user_id = stories.user_id AND user_id = ? LIMIT 1)
AS c_model_id
FROM stories
WHERE
c_model_id IS NOT NULL
AND
EXISTS (SELECT t1.tag_id FROM (
SELECT tag_id FROM stories_tags WHERE story_id = stories.id -- Here
UNION ALL
SELECT tag_id FROM models_tags WHERE model_id = c_model_id
) AS t1 GROUP BY tag_id HAVING COUNT(*) >= 2)
但是我遇到了一个新问题:我无法从最深的子查询访问 stories
表:Unknown column 'stories.id' in 'where clause'
我没能找到解决这个问题的方法,但可能有,只是我没看到。
编辑:
我找到了一个 MySQL 兼容的查询:
SELECT stories.*
FROM stories
INNER JOIN models ON model_user_id = stories.user_id AND models.user_id = ?
WHERE EXISTS
(
SELECT stories_tags.tag_id
FROM stories_tags
LEFT JOIN models_tags
ON models_tags.tag_id = stories_tags.tag_id
WHERE models_tags.model_id = models.id AND story_id = stories.id
)
我认为它等于第一个查询。有人可以帮我验证一下吗?
最佳答案
您的INTERSECT
说:只给我那些在两个 集合中都存在匹配标记的记录。所以你也可以通过标签加入表格然后搜索:
SELECT
stories.*,
(SELECT id FROM models WHERE model_user_id = stories.user_id AND user_id = ? LIMIT 1)
AS c_model_id
FROM stories
WHERE EXISTS
(
SELECT *
FROM stories_tags st
JOIN models_tags mt ON mt.tag_id = st.tag_id
WHERE st.story_id = stories.id
AND mt.model_id = stories.c_model_id
);
顺便说一下,我删除了 WHERE c_model_id IS NOT NULL
,因为为了匹配 models_tags
中的记录,这无论如何都必须为真。
作为您自己的两个建议:您的外连接 (LEFT JOIN
) 根本不是外连接,因为在您的 WHERE 子句中您说您只需要匹配项 (WHERE models_tags.model_id = models.id
) 从而将连接转换为内部连接。这看起来正是我想出的 :-) 但是您还更改了 SELECT 子句。您现在内联 models
表,而不是在它存在的情况下选择用户模型条目。因此,如果该记录不存在,您现在将得不到任何数据。您可以通过外连接 models
来解决此问题:LEFT JOIN models
。如果有多个匹配项,您现在会得到重复的结果。但是,我不知道是否有可能从子查询中不准确地获取一条记录。也许不是,那么您的查询就可以正常工作。
关于mysql - MySQL 中的 INTERSECT 替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33411431/