繁体   English   中英

在联接/ where查询中不选择重复项

[英]Not selecting duplicates in join / where query

我一直在尝试学习MySQL,但在创建联接查询而不选择重复项时遇到了一些麻烦。

基本上,这是我在的位置:

SELECT atable.phonenumber, btable.date
FROM btable
LEFT JOIN atable ON btable.id = atable.id
WHERE btable.country_id = 4

但是,在我的数据库中,有可能在atable.phonenumber列中atable.phonenumber重复的行。

例如(为清楚起见添加了星号)

  phonenumber |   date
 -------------|-----------
*555-681-2105 | 2015-08-12
 555-425-5161 | 2015-08-15
 331-484-7784 | 2015-08-17
*555-681-2105 | 2015-08-25

.. 等等。

我尝试使用SELECT DISTINCT但这不起作用。 我也正在寻找其他建议使用GROUP BY解决方案,但这引发了错误,这很可能是由于我的WHERE子句和条件WHERE 不太确定如何轻松完成此操作。

DISTINCT适用于返回的整个行,本质上说“我只需要唯一的行”-任何行值都可以参与使该行唯一

您将获得重复的电话号码,因为您只是孤立地查看该列。 数据库正在查看电话号码和日期。 您发布的行具有不同的日期,因此这些行导致不同的日期

我建议您按照评论者的建议进行操作,并决定要对日期做些什么。 如果您想要电话号码的最新日期,请执行以下操作:

SELECT atable.phonenumber, max(btable.date)
FROM battle
LEFT JOIN atable ON btable.id = atable.id
WHERE btable.country_id = 4
GROUP BY atable.phonenumber

当您编写使用分组的查询时,您将获得一组行,其中对于分组列表中的任何内容,只有一组值组合。 在这种情况下,只有唯一的电话号码。 但是,由于还需要其他值(即日期),因此必须使用所谓的聚合函数来指定要对不属于唯一集合的所有各种值进行的处理。 有时是MAX或MIN,有时是SUM,COUNT,AVG等。

如果您熟悉编程中其他地方的哈希表或字典,这就是group by的含义:它将一组值(一个键)映射到具有这些键值的行的列表中,然后聚合函数为应用于与键关联的列表中的任何值

使用group by(以及MySQL将为您隐式执行的操作)时的简单规则是编写查询,因此:

SELECT 
  List,
  of,
  columns,
  you,
  want,
  in,
  unique,
  combination,
  FN(List),
  FN(of),
  FN(columns),
  FN(you),
  FN(want),
  FN(aggregating) 
FROM table
GROUP BY
  List,
  of,
  columns,
  you,
  want,
  in,
  unique,
  combination

即,您可以将粘贴从选择列表复制到组列表。 如果您不这样做,MySQL会为您隐式地执行此操作(即,如果您在选择列表中使用一个或多个聚合函数(如max),但是忘记或忽略了group by子句,它将占用未聚合的所有内容功能并像您编写的那样运行分组)。 分组依据是否因此在很大程度上是多余的,这一点经常引起争议,但是对于分组依据,您确实可以做其他事情,例如汇总,多维数据集和分组集。 此外,如果该列用于确定性函数中,则可以将其分组,而不必对确定性函数的结果进行分组。 是否有这样做的另一场辩论:)

您应该将GROUP BY和一个汇总添加到date字段,如下所示:

SELECT atable.phonenumber, MAX(btable.date)
FROM btable
LEFT JOIN atable ON btable.id = atable.id
WHERE btable.country_id = 4
GROUP BY atable.phonenumber

这将返回最大日期,帽子是最新日期...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM