考虑以下架构:
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);
但他们是否有其他高效/优雅或更好的方法来做同样的事情?
答案 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