我有 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/