2009-02-21 38 views
0

考虑下面的模式:SQL:搜索盛大子表specifc项目

 
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 | 

而这里的breif运行模式下来: 客户可以有多个订单,一个订单可以有很多项目 注意:您可能会争辩说,这些项目应该使用product_id引用某些产品表,但现在应该让它变得简单。

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

对于给定的客户,列出所有与香格里拉启动项目

我查询的版本是这样的:

SELECT * FROM items where name LIKE'La%'

这将返回所有客户以La开头的所有项目。我想要的是,我为具有标识为1的特定客户获取所有项目。如何编写此类查询?我的第二个版本是这样的:

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

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

回答

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 
+0

我也是在写这相同的答案的中间,所以我第二并给予好评。 – 2009-02-21 10:34:40

+0

哇,你超越了:) – 2009-02-21 10:36:50

1

子SELECT是一种方法,另一种方法是JOIN表和查询。

就像这样,我的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 
4

从客户c选择i.name
加入odersØ
上c.id = o.customer_id
加盟项目我
上o.id = i.order_id其中c.id = WHATEVER_CUSTOMER_ID_YOU_WANT
和i.name LIKE“香格里拉%”