2

我有 3 个需要在 SQL 语句中链接的表(如果有帮助,我正在使用 PHP - MySQL)。我需要从第三个表中提取 vendor 字段等于“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
4

6 回答 6

2
select o.order_id from orders o inner join orders_items oi on o.order_id = oi.item_id inner join items i on oi.item_id = i.id where i.vendor='3';

许多方法可以做到这一点,例如连接、子查询、in 子句。取决于时间或内存方面的需要,最好使用也主要依赖于表的INDEX列和连接表的数据量。

于 2012-06-22T10:19:10.117 回答
2

使用,符号并不被普遍认为是不好的做法,但我认为现在同意它的人已经很少了。甚至甲骨文(其用户似乎是该语法最直言不讳的支持者)也建议不要使用它。

但我不知道有谁会支持混合,和 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 优化器从该表达式得出一个计划以给出合适的结果。通过如上所述编写,优化器将找到它认为过滤、连接、排序等的最佳顺序,以及用于执行这些操作的最佳索引等。


编辑

我注意到人们支持DISTINCTover GROUP BY

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

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

于 2012-06-22T10:20:27.180 回答
0
SELECT O.order_id AS Id
FROM orders O
INNER JOIN orders_items OI
    ON O.order_id = OI.order_id
INNER JOIN items I
    ON OI.item_id = I.id
WHERE I.vendor = '3'
GROUP BY O.order_id
于 2012-06-22T10:29:01.010 回答
0

您不需要,如果您需要删除重复项GROUP BY,只需制作 a :DISTINCT

SELECT DISTINCT o.order_id
FROM orders o
INNER JOIN orders_items oi ON oi.order_id = o.order_id
INNER JOIN items i ON i.id = oi.items_id
where i.vendor = '3'

而且,INNER JOIN在所有桌子上使用:)

于 2012-06-22T10:19:23.827 回答
0

这是有效的,也将工作::

SELECT
   DISTINCT(orders.order_id)
FROM
    items

INNER JOIN orders_items on (items.id=orders_items.item_id )
inner join orders on (orders.order_id=order_items.order_id)
WHERE
items.vendor = '3'
于 2012-06-22T10:19:33.127 回答
0
SELECT
   orders.order_id
FROM
   orders o
      INNER JOIN orders_items oi ON o.order_id = oi.order_id
      INNER JOIN items i ON oi.item_id = i.item_id
WHERE
   i.vendor = 3

table1, table2 语法不是我用过的,但我想将表列为联接更有效,因为这似乎是最被接受的方式。

此外,如果该字段为整数,则无需在供应商标准上添加语音标记。

于 2012-06-22T10:21:11.783 回答