英文:
SQL GroupBy on 2 different tables
问题
尝试创建一个查询,显示特定的姓名没有订购特定的物品。
在这里,我想要获取没有订购物品1(或2或3)的姓名。
当我连接这两个表并在itemid != 1的情况下进行过滤时,仍然会得到订购1的行,带有物品2和3。
如何在itemid != 1的情况下仅获得订单4?
英文:
Trying to come up with a query which shows that a particular name did not order particular item
Name | OrderID |
---|---|
Name 1 | Order 1 |
Name 2 | Order 2 |
Name 3 | Order 3 |
Name 4 | Order 4 |
OrderID | Item ID |
---|---|
Order 1 | Item 1 |
Order 1 | Item 2 |
Order 1 | Item 3 |
Order 2 | Item 1 |
Order 2 | Item 2 |
Order 2 | Item 3 |
Order 2 | Item 4 |
Order 2 | Item 5 |
Order 3 | Item 1 |
Order 3 | Item 2 |
Order 3 | Item 4 |
Order 4 | Item 3 |
Order 4 | Item 4 |
Order 4 | Item 5 |
Order 4 | Item 6 |
Here I'm looking to get the Name which did not order Item 1 (or 2 or 3)
When I join the 2 tables, and do where itemid != 1, I'm still getting Order 1 rows with Item 2,3
How do I get only Order 4 when I do itemid != 1?
Here I'm looking to get the Name which did not order Item 1 (or 2 or 3)
When I join the 2 tables, and do where itemid != 1, I'm still getting Order 1 rows with Item 2,3
How do I get only Order 4 when I do itemid != 1?
答案1
得分: 1
选择名称
从 t1
其中不存在 (
选择 1 从 t2
其中 t2.OrderId = t1.OrderId
和 t2.ItemId = 'item 1'
);
英文:
How about...
Select Name
from t1
where not exists (
select 1 from t2
where t2.OrderId = t1.OrderId
and t2.ItemId = 'item 1'
);
答案2
得分: 0
假设您只想使用基本的SQL语法,您可以在HAVING子句中使用JOIN、GROUP BY和2个条件(尚未订购item1且已经订购其他商品)来获得您想要的结果。
以下是一个示例代码(获取未订购item 1的名称):
SELECT
o.name
FROM
orders o
JOIN
order_items oi
ON
o.order_id = oi.order_id
GROUP BY
o.name
HAVING
(SUM(CASE WHEN oi.item_id = 1 THEN 1 ELSE 0 END) = 0
AND
SUM(CASE WHEN oi.item_id != 1 THEN 1 ELSE 0 END) > 0
)
RUNNING EXAMPLE SQLFIDDLE LINK
示例输出:
name |
---|
name_4 |
英文:
Assume you only want to use Basic SQL syntax, you can use JOIN, GROUP BY, AND 2 conditions(haven't ordered item1 AND have ordered other items) in HAVING clause to get what you want.
See the following code as example(get the name who haven't order item 1:
SELECT
o.name
FROM
orders o
JOIN
order_items oi
ON
o.order_id = oi.order_id
GROUP BY
o.name
HAVING
(SUM(CASE WHEN oi.item_id =1 THEN 1 ELSE 0 END) =0
AND
SUM(CASE WHEN oi.item_id !=1 THEN 1 ELSE 0 END) >0
)
RUNNING EXAMPLE SQLFIDDLE LINK
example output:
name |
---|
name_4 |
答案3
得分: 0
以下是您要翻译的内容:
WITH
-- 您的输入
orders("Name", Order_ID) AS (
SELECT 'Name 1', 'Order 1'
UNION ALL SELECT 'Name 2', 'Order 2'
UNION ALL SELECT 'Name 3', 'Order 3'
UNION ALL SELECT 'Name 4', 'Order 4'
)
,
order_items(Order_ID, Item_ID) AS (
SELECT 'Order 1', 1
UNION ALL SELECT 'Order 1', 2
UNION ALL SELECT 'Order 1', 3
UNION ALL SELECT 'Order 2', 1
UNION ALL SELECT 'Order 2', 2
UNION ALL SELECT 'Order 2', 3
UNION ALL SELECT 'Order 2', 4
UNION ALL SELECT 'Order 2', 5
UNION ALL SELECT 'Order 3', 1
UNION ALL SELECT 'Order 3', 2
UNION ALL SELECT 'Order 3', 4
UNION ALL SELECT 'Order 4', 3
UNION ALL SELECT 'Order 4', 4
UNION ALL SELECT 'Order 4', 5
UNION ALL SELECT 'Order 4', 6
)
-- 您的输入结束 - 真正的查询从下面开始
SELECT
"Name"
FROM orders
LEFT JOIN order_items
ON order_items.order_id = orders.order_id
AND item_id = 1
WHERE order_items.order_id IS NULL;
-- 输出 Name
-- 输出 --------
-- 输出 Name 4
英文:
Or like this - a failing LEFT JOIN - using the data formats as from your dbfiddle entry...
WITH
-- your input
orders("Name",Order_ID) AS (
SELECT 'Name 1','Order 1'
UNION ALL SELECT 'Name 2','Order 2'
UNION ALL SELECT 'Name 3','Order 3'
UNION ALL SELECT 'Name 4','Order 4'
)
,
order_items(Order_ID,Item_ID) AS (
SELECT 'Order 1',1
UNION ALL SELECT 'Order 1',2
UNION ALL SELECT 'Order 1',3
UNION ALL SELECT 'Order 2',1
UNION ALL SELECT 'Order 2',2
UNION ALL SELECT 'Order 2',3
UNION ALL SELECT 'Order 2',4
UNION ALL SELECT 'Order 2',5
UNION ALL SELECT 'Order 3',1
UNION ALL SELECT 'Order 3',2
UNION ALL SELECT 'Order 3',4
UNION ALL SELECT 'Order 4',3
UNION ALL SELECT 'Order 4',4
UNION ALL SELECT 'Order 4',5
UNION ALL SELECT 'Order 4',6
)
-- end of your input - real query starts below
SELECT
"Name"
FROM orders
LEFT JOIN order_items
ON order_items.order_id=orders.order_id
AND item_id = 1
WHERE order_items.order_id IS NULL;
-- out Name
-- out --------
-- out Name 4
答案4
得分: 0
这个查询基本上会返回那些没有订购某个物品的人的姓名,你可以通过选择given_item_id
来确定是哪个物品。如果你需要更详细的输出,比如在第一行显示某个物品,然后在左边显示没有订购它的人的列表,那么我们可能需要知道你正在使用的数据库(Oracle?PostgreSQL?MySQL?),因为这些信息需要用于选择正确的聚合/连接函数。
英文:
It's a little difficult to reply not having the actual tables at hand and not knowing the exact structure of the output you wish to see.
This query basically returns you the names of the people that DID NOT order some item, and you choose which one by picking the given_item_id
. If you need more granular output, like some item on the first row and then the list of the people who did not order it on the left then we might need to know the DB you are using (Oracle? PostgreSQL? MySQL?), as this information is required to pick the correct aggregation/concatenation function.
SELECT DISTINCT ords.person_name
FROM orders AS ords
LEFT JOIN items AS itms ON ords.order_id = itms.order_id
WHERE itms.item_id = 'given_item_id'
OR ords.person_name NOT IN (
SELECT person_name
FROM orders
WHERE order_id IN (
SELECT order_id
FROM items
WHERE item_id = 'given_item_id'
)
);
答案5
得分: 0
An other way to do it using left join
select t1.Name
from table1 t1
left join (
select Name
from table1 t1
inner join table2 t2 on t1.OrderID = t2.OrderID
WHERE t2.ItemID = 'Item 1'
) as s on s.Name = t1.Name
where s.Name is null;
英文:
An other way to do it using left join
select t1.Name
from table1 t1
left join (
select Name
from table1 t1
inner join table2 t2 on t1.OrderID = t2.OrderID
WHERE t2.ItemID = 'Item 1'
) as s on s.Name = t1.Name
where s.Name is null;
答案6
得分: 0
以下是代码部分的翻译:
Jast another example, all not ordered by Name items
select n.Name,i.ItemId,t.ItemId xItemId from
table1 n left join (select distinct ItemId from table2) i on 1=1
left join
(
select t1.Name,t2.ItemId
from table1 t1 left join table2 t2 on t2.OrderId=t1.OrderId
group by t1.Name,t2.ItemId
)t on t.Name=n.Name and t.ItemId=i.ItemId
where t.Itemid is null
请注意,这部分是原始代码,没有进行翻译。
英文:
Jast another example, all not ordered by Name items
select n.Name,i.ItemId,t.ItemId xItemId from
table1 n left join (select distinct ItemId from table2) i on 1=1
left join
(
select t1.Name,t2.ItemId
from table1 t1 left join table2 t2 on t2.OrderId=t1.OrderId
group by t1.Name,t2.ItemId
)t on t.Name=n.Name and t.ItemId=i.ItemId
where t.Itemid is null
Name | ItemId | xItemId |
---|---|---|
Name 1 | Item 4 | null |
Name 1 | Item 5 | null |
Name 1 | Item 6 | null |
Name 2 | Item 6 | null |
Name 3 | Item 3 | null |
Name 3 | Item 5 | null |
Name 3 | Item 6 | null |
Name 4 | Item 1 | null |
Name 4 | Item 2 | null |
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论