1

假设我有一个由 id、customer_id、order_date 和其他内容组成的订单表。我还有一个人们可以订购的物品表,其中包含 item_id、item_name 和 price。最后有一个名为 c 的表将 order_id 与 item_id 连接起来。

我想做的是从包含我按名称搜索的某些项目的所有订单的订单表中获取一些数据。

我可以做这样的事情,但这显然是一个糟糕的解决方案,即使只有两个项目,更不用说五个左右了。但我认为它说明了我在寻找什么:

SELECT o.id, customer_id, order_date
FROM orders AS o, c AS c1, items AS i1, c AS c2, item AS i2
WHERE item_name = 'foo' AND c1.item_id = i1.id AND c1.order_id = o.id
AND item_name = 'bar' AND c2.item_id = i2.id AND c2.order_id = o.id

有人可以建议一个更快的工作解决方案吗?我假设这种类型的查询很常见,所以我想至少有一个快速而聪明的解决方案。:)

需要考虑的一件事是 item_names 不一定是唯一的,这意味着任何使用 HAVING COUNT(...) > 1 的解决方案都将检索包含 'foo' 两次而不是至少一个 'foo' 和一个'酒吧'。

编辑:

有几个人建议我使用“WHERE item_name IN('foo','bar')”然后删除他们的答案,但我正在寻找的查询应该检索包含“foo”和“bar”的订单,不只是其中任何一个。如果我应该使用显式联接以不同的方式构造上面的示例查询,我想它看起来像这样:

SELECT o.id, customer_id, order_date
FROM orders AS o
INNER JOIN c AS c1
ON c1.order_id = o.id
INNER JOIN items AS i1
ON i1.id = c1.item_id
INNER JOIN c AS c2
ON c2.order_id = o.id
INNER JOIN items AS i2
ON i2.id = c2.item_id
WHERE i1.item_name = 'foo' 
AND i2.item_name = 'bar'
GROUP BY o.id

(这需要相当长的时间来执行)

4

1 回答 1

0

Rudy Limeback FTW:

SELECT o.id
FROM (SELECT c.order_id
    FROM items
    INNER JOIN c
    ON c.itemid = items.id
    WHERE items.item_name IN ('foo','bar')
    GROUP BY c.orderid
    HAVING COUNT(DISTINCT item_name) = 2
  ) AS these
INNER JOIN orders
ON orders.id = these.orderid
于 2013-04-10T16:48:55.683 回答