在连接上选择不同的记录

Geo*_*rge 13 mysql select join distinct

我有两个mysql表 - 一个销售表:

+----------------+------------------------------+------+-----+---------+-------+
| Field          | Type                         | Null | Key | Default | Extra |
+----------------+------------------------------+------+-----+---------+-------+
| StoreId        | bigint(20) unsigned          | NO   | PRI | NULL    |       |
| ItemId         | bigint(20) unsigned          | NO   |     | NULL    |       |
| SaleWeek       | int(10) unsigned             | NO   | PRI | NULL    |       |
+----------------+------------------------------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)

和一个项目表:

+--------------------+------------------------------+------+-----+---------+-------+
| Field              | Type                         | Null | Key | Default | Extra |
+--------------------+------------------------------+------+-----+---------+-------+
| ItemId             | bigint(20) unsigned          | NO   | PRI | NULL    |       |
| ItemName           | varchar(100)                 | NO   |     | NULL    |       |
+--------------------+------------------------------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)

sales表包含每个ItemID的多个记录- 每个SaleWe​​ek一个记录.我想通过加入两个表来选择所有出售的商品,如下所示:

SELECT items.ItemName, items.ItemId FROM items
JOIN sales ON items.ItemId = sales.ItemId 
WHERE sales.StoreID = ? ORDER BY sales.SaleWeek DESC;
Run Code Online (Sandbox Code Playgroud)

但是,这将根据每个SaleWe​​ek的多个条目返回多个ItemId值.我可以做一个明确的选择只返回一个ItemID - 我不想要查询最新的SaleWe​​ek,因为有些项目可能没有最新的SaleWe​​ek的条目所以我需要得到最后的销售.我是否需要指定DISTINCT或使用LEFT OUTER JOIN或其他东西?

Kal*_*see 22

A DISTINCT应该做你想要的:

SELECT DISTINCT items.ItemName, items.ItemId FROM items
JOIN sales ON items.ItemId = sales.ItemId 
WHERE sales.StoreID = ? ORDER BY sales.SaleWeek DESC;
Run Code Online (Sandbox Code Playgroud)

这将只返回不同的items.ItemName, items.ItemId元组.


DRa*_*app 8

你也有关于销售周的评论.想要最近一周,您可能想尝试使用GROUP BY

SELECT 
      items.ItemName, 
      items.ItemId,
      max( Sales.SaleWeek ) MostRecentSaleWeek
   FROM 
      items JOIN sales ON items.ItemId = sales.ItemId
   WHERE 
      sales.StoreID = ? 
   GROUP BY
      items.ItemID,
      items.ItemName
   ORDER BY
      MostRecentSaleWeek,   -- ordinal column number 3 via the MAX() call
      items.ItemName
Run Code Online (Sandbox Code Playgroud)

您可能必须通过更改顺序为序第3列引用如果你因此基于该列想要..这个查询将给你每个不同的项目,最近一周内它被出售.