我有一张大致如下所示的表格:
+---------------------+----------+ | 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)我还想选择本(或另一个指定的)年中所有属于RETURNING的项目,这显然意味着它们已出现在前几年中。该查询应给我“苹果”作为2014年的结果。
为了明确起见,我只想将这两个查询用于与前几年的比较。因此,如果我将2013指定为运行该查询的年份,则“ Apples”应显示为新的,而不是返回。
我不一定要在一个查询中同时使用这两种方法(我怀疑是否有可能),因此两个不同的查询(每种情况一个)非常好。
新* 项目的( 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小提琴 )为 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;