我一直在努力学习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
条款和条件。我不确定如何轻松实现这一目标。
答案 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
这将返回最大日期,帽子是最新日期......