我有4个不同行和列的表,我需要获取某些值。我有一些困难,似乎无法得到它。
customers
表:
items
表:
orders
表:
addresses
表:
我希望得到的价值是:
列出只有一个订单的所有商品的itemID
和description
。
现在我可以获得itemID
和description
,但我不知道如何将其归结为仅订购一次的商品。我正在考虑使用JOIN
和GROUP BY
,但我似乎无法找到正确的组合。
SELECT itemID,
description
FROM items
GROUP BY itemID
列出所有将商品发送到多个地址的客户。
这个我必须以某种方式使用JOIN
,因为customerID
会相同而不是地址吗?
SELECT customerID,
streetName,
housenum
FROM addresses
JOIN customers
ON addresses.streetName = customers.customerID
返回所有订单产生的总收入。
我不能只使用:
SELECT SUM(price),
orderID
FROM items
JOIN orders
ON orders.orderID = items.price ?
列出已将相同商品发送到至少两个不同地址的所有客户的名字和姓氏。
SELECT fName,
lName,
itemID,
streetName,
housenum
FROM addresses,
customers,
items,
somehow join multiple(2+)?
答案 0 :(得分:0)
我对所有查询可能不对,但我发现问题中列出的项目非常有趣,并决定尝试一下。
仅售出一次的商品
SELECT o.itemID,
i.description
FROM orders o
LEFT JOIN items i
ON i.id = o.itemID
GROUP BY o.itemID
HAVING COUNT(*) = 1;
在此查询中,您需要加入items
表,以便description
检索GROUP BY
和itemID
,以便您可以专门使用COUNT
1}}为每个itemID
我们可以使用HAVING
来获取1个订单。
已发货到差异地址的客户
SELECT COUNT(DISTINCT addressID) as diff_address,
c.fName,
c.lName
FROM orders o
LEFT JOIN customers c
ON o.customerID = c.id
GROUP BY o.customerID
HAVING diff_address > 1;
我在这里使用DISTINCT函数来消除重复的地址和GROUP BY
customerID
所以我可以为每个客户提供一个唯一地址列表,并再次使用HAVING
我们得到客户已经发运了超过1个不同地址的产品。我还在客户表上使用JOIN
来获取他们所需的信息。
总收入
SELECT SUM(i.price) as total
FROM orders o
LEFT JOIN items i
ON o.itemID = i.id;
我猜这个是最简单的一个,通过在项目表上使用JOIN
,我能够阅读每个项目price
,然后我可以按顺序求和以获得总数销售。
将相同项目发送到至少2个不同地址的客户列表
SELECT c.fName,
c.lName,
COUNT(oi.itemID) AS `total items with diff address >= 2`
FROM customers c
JOIN (SELECT customerID,
itemID,
COUNT(DISTINCT addressID) AS diff_address
FROM orders
GROUP BY itemID, customerID
HAVING diff_address >= 2
) AS oi
ON oi.customerID = c.id
GROUP BY c.id;
这是最复杂的一个,希望我能解释一下。首先,我使用子查询启动它,在那里我可以列出每个拥有多个地址的客户的所有项目,然后在JOIN
上使用customerID
我可以计算给定客户已经提供的多少个不同的项目2个或更多差异地址。
如果您发现任何查询不好或有任何建议请告诉我,以便我可以改进。