SQL:在孙子表中搜索特定项目

时间:2009-02-21 10:21:41

标签: sql

考虑以下架构:

Customers:
Col      | Type    |
-------------------|
id       | INTEGER |
name     | VARCHAR |

Orders:
Col         | Type    |
----------------------|
id          | INTEGER |
customer_id | INTEGER |
date        | DATE    |

Items
Col         | Type    |
----------------------|
id          | INTEGER |
order_id    | INTEGER |
name        | VARCHAR |
quantity    | INTEGER |

以下是架构的简称: 客户可以拥有多个订单,订单可以包含许多商品 注意:您可能会认为这些项目应该引用带有product_id的某些产品表,但现在就让它变得简单。

从我的数据库中,我想问以下问题:

对于给定的客户,列出以La开头的所有项目。

我的查询版本是这样的:

SELECT * FROM items WHERE name LIKE'La%'

这将返回所有客户以La开头的所有项目。我想要的是我得到了具有id id的SPECIFIC客户的所有项目。我如何编写这样的查询?我的第二个版本是这样的:

SELECT * FROM items WHERE name LIKE'La%'AND order_id in(SELECT id FROM orders WHERE customer_id = 1);

但他们是否有其他高效/优雅或更好的方法来做同样的事情?

3 个答案:

答案 0 :(得分:4)

执行此操作的优雅方式称为连接。

SELECT
  c.id            customer_id,
  c.name          customer_name,
  i.id            item_id,
  i.name          item_name,
  COUNT(i.id)     order_count,
  SUM(i.quantity) items_ordered
FROM
  customers c
  INNER JOIN orders o ON c.id = o.customer_id
  INNER JOIN items  i ON i.id = o.order_id
WHERE
  i.name LIKE 'La%'
  AND c.id = 1
GROUP BY
  c.id,
  c.name,
  i.id,
  i.name

答案 1 :(得分:4)

  

从客户c中选择i.name   加入oders o   在c.id = o.customer_id
  加入项目i
  on o.id = i.order_id,其中c.id = WHATEVER_CUSTOMER_ID_YOU_WANT
  和i.name LIKE'La%'

答案 2 :(得分:1)

Sub-SELECT是一种方法,另一种方法是加入表并查询。

像这样,我的SQL非常生疏,但我认为这应该有用。

SELECT c.Name, o.id, o.date, i.name, i.quantity FROM Customer AS c
LEFT OUTER JOIN Orders AS o ON c.id = o.customer_id
LEFT OUTER JOIN Items AS i on o.id = i.order_id
WHERE i.name LIKE 'La%' AND c.id = 1