mysql - MySQL 中的 INTERSECT 替换

标签 mysql sql

我正在尝试使这个查询与 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/

相关文章:

php - 使用多个搜索词进行搜索

php - 从 MySQL 数据库中获取后,在浏览器上永久显示 html 表单输入?

mysql - mysql问题中的IF运算符

sql - 从databricks中删除或覆盖sql表和 View

SQL Server 2008 插入后创建触发器...返回id...调用存储过程

mysql - 一张表用于多个 hasman 关系

sql - SQL中如何连接多个select语句

mysql - 如何在 MySQL 中将数据从一个表移动到另一个表?

php - 在 PHP 中从数据库中按字母顺序排序

php - 是否可以在 PHP 查询中通过 MySQL 表搜索所有列,而无需输入每个列名称?