mysql - JOIN 在 MySQL 中如何工作?

标签 mysql sql database relational-database normalization

虽然问题标题和很多讨论重复,但我没有找到这个问题的答案:

将标准化标签表的简单连接视为

SELECT tags.tag
FROM tags
    INNER JOIN tag_map
    ON tags.tag_id=tag_map.tag_id
WHERE article_id=xx

JOIN 是否与整个标签表和 tag_map 一起工作,然后过滤创建的(JOINed)表以查找带有 WHERE 子句的行对于文章id

OR JOIN 只会连接 article_id=xx 的 tag_map 表行?

后一种方法应该是相当快的!

最佳答案

它会做前者,据我所知,WHERE 是在生成的 JOINed 表上明确执行的。 (免责声明:MySQL 可能会在某些情况下对此进行优化,我不知道)。

要强制后一种行为并首先执行 WHERE,您可以在 JOIN ON 语句中添加一个额外的过滤器:

SELECT tags.tag 
    FROM tags 
    INNER JOIN tag_map 
        ON tags.article_id=xx
        AND tags.tag_id=tag_map.tag_id 
    WHERE article_id=xx

关于mysql - JOIN 在 MySQL 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8093802/

相关文章:

mysql - 用户 'root' 已超出 'max_questions' 资源

mysql - 更新命令失败。有人可以检查我的查询吗?

mysql - 如何在mysql中为表指定一次别名

python - 使用 web2py 修改 SQL 表模式

mysql - 将 "readonly"对象作为序列化数据存储在关系数据库中

php - 如何将一个表中的两个或多个列与另一个表中的一列连接起来,即使第一个表列中存在 NULL 值

php - SELECT 列表不在 GROUP BY 子句中并且包含非聚合列 'explore.ratings.id'

MySQL 查询在 linux shell 脚本中中断,但查询在 mysql 命令行中运行

sql - 在另一个 SELECT 中使用 SELECT 结果

php - 根据选中的复选框更新数据库