2009-02-21 37 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「香格里拉%」