我有一张大致如下所示的表格:
+---------------------+----------+
| date | item |
+---------------------+----------+
| 2008-11-30 11:15:59 | Plums |
| 2012-11-08 19:42:37 | Lemons |
| 2013-01-30 18:58:07 | Apples |
| 2013-02-12 13:44:45 | Pears |
| 2014-06-08 11:46:48 | Apples |
| 2014-09-01 20:28:03 | Oranges |
+---------------------+----------+
我现在想为两种情况选择项目:
1) 我想为今年(或不同的指定年份)选择今年新的所有不同项目,这意味着它们在前几年没有出现过。因此,此查询应为我提供 2014 年的“橙子”。
2) 我还想为这一年(或另一指定的)选择所有不同的项目,这些项目正在返回,这显然意味着它们在前几年出现过。这个查询应该给我“苹果”作为 2014 年的结果。
澄清一下,我想使用这两个查询只是为了与往年进行比较。因此,如果我将 2013 指定为运行此查询的年份,“Apples”应该显示为新的,而不是返回。
我不一定需要在一个查询中同时使用这两种东西(我怀疑这是否可能),所以两个不同的查询,每种情况一个,是完全没问题的。
最佳答案
对于 NEW 项,( SQL Fiddle ) 怎么样:
SELECT DISTINCT m1.item
FROM MyTable m1
LEFT JOIN MyTable m2 ON m1.item = m2.item AND YEAR(m2.date) < 2014
WHERE YEAR(m1.date) = 2014
AND m2.date IS NULL
并且 ( SQL Fiddle ) 对于 RETURNING 项目:
SELECT DISTINCT m1.item
FROM MyTable m1
INNER JOIN MyTable m2 ON m1.item = m2.item
WHERE YEAR(m1.date) = 2014
AND YEAR(m2.date) < 2014
如果您想将两个查询组合在一起(SQL Fiddle 或 SQL Fiddle):
SELECT DISTINCT m1.item, 'New' AS Status
FROM MyTable m1
LEFT JOIN MyTable m2 ON m1.item = m2.item AND YEAR(m2.date) < 2014
WHERE YEAR(m1.date) = 2014
AND m2.date IS NULL
UNION ALL
SELECT DISTINCT m1.item, 'Returning' AS Status
FROM MyTable m1
INNER JOIN MyTable m2 ON m1.item = m2.item
WHERE YEAR(m1.date) = 2014
AND YEAR(m2.date) < 2014
ORDER BY Status;
关于mysql - 选择指定年份的新商品或返回商品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25853891/