【问题标题】:select records which have different values in the same column and different values in another column without subqueries在没有子查询的情况下选择同一列中具有不同值和另一列中具有不同值的记录
【发布时间】:2012-11-16 11:23:23
【问题描述】:

我有这张桌子:

item        year
----        ----
1           1999 
2           1999
3           1999 
2           2000 
4           2000 
2           2001
3           2001
4           2001
5           2001

我需要这个结果(选择 1999)

item        year
----        ----
4           2000
4           2001
5           2001

总而言之,我需要获取不是在 1999 年,而是在另一个不同年份定义的新项目(这是为了稍后在另一个查询中添加它们)。

我使用的是旧的 MySQL 版本,并且我无法使用子查询。有兼容的解决方案吗?

【问题讨论】:

标签: mysql sql select


【解决方案1】:

这样的事情呢

SELECT t1.item, t1.year from table as t1
LEFT JOIN table as t2 ON t2.item = t1.item AND t2.year = 1999
WHERE t2.item IS NULL

在“英语”中,它的意思是,从我的表中选择所有项目。然后为每个项目尝试查找它们是否在 1999 年的表中,否则设置为 NULL。 然后你只需要说“将没有匹配元素的元素保留在 t2 中。

不确定我的解释是否更好

编辑:您当然需要将 table 替换为您自己的表的名称。我在一个小例子上对其进行了测试,它似乎可以工作。

EDIT2:如果您查看 LEFT JOIN 的结果,您会得到类似这样的结果:

t1.item     t1.year    t2.item     t2.year
----        ----       ----        ----       
1           1999       1           1999
2           1999       2           1999
3           1999       3           1999
2           2000       2           1999
4           2000       NULL        NULL
2           2001       2           1999
3           2001       3           1999
4           2001       NULL        NULL
5           2001       NULL        NULL

然后,如果您添加 WHERE t2.item IS NULL,您只会在表中保留没有 1999 年的那些。 这是更好的理解方式吗?

【讨论】:

  • 你试过了吗?因为我认为它有效。您想排除表中具有 1999 年的行的每个项目。这就是 LEFT JOIN 的要点:获取表中具有 1999 年的项目。然后 WHERE xxx IS NULL 只会保留那些不在加入。
  • 完美!!非常感谢
  • 再次阅读您的问题和@bohemian 的答案,如果您也只想要相关年份之后的项目,您可以添加AND t1.year > 1999
【解决方案2】:
select t2.item, t2.year
from mytable t1
left join mytable t2 
    on t2.year > t1.year 
    and t2.item != t1.item
where t1.year = 1999
and t2.item is null

【讨论】:

  • 您的查询没有选择任何记录
猜你喜欢
  • 1970-01-01
  • 2017-02-14
  • 2015-05-23
  • 2012-05-25
  • 2017-12-24
  • 2019-05-31
  • 2015-02-15
  • 2015-07-17
  • 2023-01-11
相关资源
最近更新 更多