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

时间:2017-09-08 04:42:19

标签: mysql sql

我一直在努力学习MySQL,我在创建连接查询时遇到了一些麻烦,因为我没有选择重复项。

基本上,这就是我所在的地方:

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

但是,在我的数据库中,列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条款和条件。我不确定如何轻松实现这一目标。

2 个答案:

答案 0 :(得分:1)

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(以及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子句 - 它将采取不在聚合中的所有内容功能并运行分组,就像你写的一样)。分组是否因此在很大程度上是多余的经常被争论,但是你可以对组进行其他事情,例如汇总,立方体和分组集。如果该列用于确定性函数,您也可以对列进行分组,而不必对确定性函数的结果进行分组。是否有任何意义这样做是另一次辩论:)

答案 1 :(得分:1)

您应该将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

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