MySQL JOIN两个表有一个共同条件和一个交叉表条件

时间:2014-01-23 11:47:11

标签: mysql sql database

我想从网站5中选择所有画廊,并加入他们的类别以显示类别的名称。我的问题是:以下三种方式选择这些数据是相同的还是就速度而言它们有所区别?

1)

SELECT *
FROM `gallery`
    JOIN `category`
        ON
            `gallery`.`category` = `category`.`id` AND
            `gallery`.`website` = `category`.`website`
WHERE `gallery`.`website` = 5

2)

SELECT *
FROM `gallery`
    JOIN `category`
        ON
            `gallery`.`category` = `category`.`id` AND
            `category`.`website` = 5
WHERE `gallery`.`website` = 5

3)

SELECT *
FROM `gallery`
    JOIN (
        SELECT *
        FROM `category`
        WHERE `website` = 5
    ) `category`
        ON `gallery`.`category` = `category`.`id`
WHERE `gallery`.`website` = 5

2 个答案:

答案 0 :(得分:0)

使用内连接时,所有三个都在语义上等效。

我更喜欢第一种方法,因为它使join显式化,并将连接的条件放在一个地方。其他人冒的风险是,在查询的不同部分更改常量可能会对连接产生意外影响。

最后一个,使用子查询可能会对性能产生一些影响。 MySQL倾向于实现子查询。结果,性能可能会有点差。

编辑:

如上所述,它们与left outer join相同,但与right outer joinwhere条件在gallery上的情况不同。

在外连接中,on子句中的过滤器不会影响第一个表中的填充。连接的逻辑是“如果匹配则返回一行。如果”外连接“表中的值根本不匹配,则仍然返回该行”。另一方面,where确实在加入后进行过滤。

答案 1 :(得分:0)

查询1和2与性能完全相同。查询3将明显变慢。当然,查询1和2的性能取决于索引。您应该在表website中的列gallery上创建索引,并在表id中的列websitecategory上建立索引。