mysql - SQL 3 表连接

标签 mysql sql join

我有 3 个表需要在 SQL 语句中链接(我正在使用 PHP - MySQL,如果有帮助的话)。我需要提取第三个表中供应商字段等于“3”的所有订单,如下所示:

orders   -  orders_items - items

order_id -> order_id
            item_id     -> id
                           vendor = '3'

我相信有很多方法可以通过各种 WHERE 和 JOINS 来做到这一点,但我要求与下面的方法相比最有效的方法:

SELECT
    orders.order_id
FROM
    items, orders
INNER JOIN
    orders_items
ON
    orders.order_id = orders_items.order_id
WHERE
    orders_items.item_id = items.id
AND
    items.vendor = '3'
GROUP BY
    orders.order_id

最佳答案

使用 , 表示法并不被普遍认为是不好的做法,但我认为现在只有少数人同意它。甚至 Oracle(其用户似乎是该语法最强烈的支持者)也建议不要使用它。

但我不知道有人会支持混合 和 ANSI-92 的 JOIN 语法。这只是自找麻烦。

SELECT
  orders.order_id
FROM 
  orders
INNER JOIN
  orders_items
    ON orders.order_id = orders_items.order_id
INNER JOIN
  items
    ON orders_items.item_id = items.id
WHERE
  items.vendor = '3'
GROUP BY
  orders.order_id

SQL 优化器不会完全按照您指定的方式执行。 SQL 只是一个表达式,SQL 优化器从中导出一个计划以给出合适的结果。通过按照上面的方式编写它,优化器将找到它认为过滤、连接、排序等的最佳顺序,以及用于执行这些操作的最佳索引等。


编辑

我注意到人们支持 DISTINCT 而不是 GROUP BY

虽然 DISTINCT 稍微短一些,但它并没有更快,并且确实对您施加了限制。例如,您以后无法添加 COUNT(*),但使用 GROUP BY 则可以。

简而言之,GROUP BY 可以做 DISTINCT 可以做的任何事情,但反之则不然。我只在非常琐碎的代码片段中使用DISTINCT,这样我就可以在一行上得到一个简单的查询。即便如此,随着代码的发展,我后来常常会有点后悔,我需要恢复到GROUP BY

关于mysql - SQL 3 表连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11154265/

相关文章:

mysql - 数据库建模 : how to relate a book to its bindings?

php - Symfony:获取两个表的结果

mysql - 升级到 5.6 后找不到 mysql/mysql.h

sql - 0x8FFF 在 nvarchar 比较中有何意义?

php - Zend Db 表双连接

php - 在 PHP 中递归期间显示子类别并将类添加到列表

mysql - MySQL中实现where条件varchar字段

mysql - SQL |如何根据记录id和另一列获取所有记录ID? (可能是简单的问题:) )

php - 我如何使用 MySQL Join 按最后回复对论坛主题进行排序?

MySQL LEFT JOIN - 值可以为 NULL