2017-09-08 55 views
0

我一直在尝试学习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

这里的问题是如何处理不同的值?像哪些星号行应该返回,因为它们有不同的日期? –

+0

我不关心日期可能相同,我只关心电话号码是一样的。我基本上试图完成的是不选择具有相同电话号码的行。 –

+0

为了进一步阐明 - 我确实希望有一次选择相同电话号码的行 - 我只是不希望在20个不同的行中返回相同的电话号码。 –

回答

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:将一组值(键)映射到具有这些键值的行列表,然后聚集功能被应用到任何一个值,在使用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 

ie即可将粘贴从您的选择列表复制到您的组列表中。如果你不这样做,MySQL会隐式地为你做这件事(例如,如果你在你的选择列表中使用一个或多个聚合函数,如max,但忘记或省略group by子句 - 它会将所有不在聚合中的东西函数并像编写它一样运行分组)。分组是否因此在很大程度上是多余的经常引起争议,但是确实存在其他可以用于分组的组件,例如汇总,多维数据集和分组集。如果该列在确定性函数中使用,而不必将其确定性函数的结果进行分组,则您也可以在列上进行分组。是否有任何一点这样做是另一次的辩论:)

+0

太棒了!感谢您对DISTINCT功能的解释。我没有意识到它适用于整行而不是单列。 –

+0

这很令人困惑,因为你可以有不同的适用于特定的列,在'SELECT course',COUNT(gender)COUNT(不同性别)FROM studentenrollment GROUP BY course'的意义上 - 计数性别意愿(只要每个人都有性别)可以有效地统计课程中的学生人数,但对不同性别进行有效计数可以告诉我们一门课程是否完全是男性或女性。这种独特使用是每列,您的用途是每行,尽管在位置上您可以被原谅它只适用于第一列 –

+0

增加了一些关于让分组工作的更多信息 –

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 

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