mysql - 选择指定年份的新商品或返回商品

标签 mysql sql union self-join

我有一张大致如下所示的表格:

+---------------------+----------+
| 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 FiddleSQL 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/

相关文章:

mysql - 如何使用 JOIN 从两个表中计数

SQL 多个共享 WHERE 条件

sql - 更新并返回一些行两次

mysql - 从sql查询结果中获取计数

php - Yii 框架数据库中的新列未显示在 $model->getAttributes() 方法调用的输出中?

sql-server - 在 View 内使用 UNION select

ios - 是否可以使用MagicalRecord/Core数据进行类似UNION的查询

php - 仅显示 1 个 mysql 查询中未分类的项目

php - 使用 CodeIgniter 将图像上传到我的数据库

mysql - 当 `IN` 似乎不允许时如何重新表述 MySQL 查询?