【问题标题】:How to use SELECT DISTINCT and CONCAT in the same SQL statement如何在同一 SQL 语句中使用 SELECT DISTINCT 和 CONCAT
【发布时间】:2012-02-20 03:01:27
【问题描述】:

所以我将这个 SQL 的结果输入到一个数组中。该数组稍后成为在键入时操作的文本框的建议。我希望它只返回每个名字 1 次,即使此人有多个约会。目前,这会返回具有该姓名的人的所有约会,因此如果“Brad Robins”有 5 个约会,并且我开始输入“Brad”,它会在建议中显示“Brad Robins”5 次,而不是只显示一次。

$sql = "SELECT DISTINCT CONCAT(clients.studentFirstName, ' ', clients.studentLastName) AS name, appointments.location, appointments.subLocation, appointments.appointmentAddress1, appointments.appointmentAddress2, appointments.appointmentCity, appointments.appointmentState, appointments.appointmentZip, appointments.startTime, appointments.endTime, appointments.date, clients.school
                    FROM appointments JOIN clients
                    ON appointments.clientID = clients.clientID
                    WHERE CONCAT(clients.studentFirstName, ' ', clients.studentLastName) = '".$roommate."' AND clients.school = '".$school."';";

在我看来,DISTINCT 和 CONCAT 似乎并没有很好地结合在一起。

【问题讨论】:

  • 如果此查询的唯一目的是返回一个名称列表以向用户建议,而您实际上并没有在程序的最终输出中使用约会表......为什么你一开始就加入了吗?
  • 我稍后使用其他信息,但很容易将其分开并执行两个查询,第一个只留下名称

标签: sql select distinct concat


【解决方案1】:

问题出在其他领域; DISTINCT 适用于整个结果。最好的办法可能是分开查询或填充 2 个不同的数组;如果您按名称排序,则可以通过仅在名称更改时复制到 dest 数组来删除重复项。

【讨论】:

  • 感谢您的回复,我会试试这个并回复您。
  • 这两个答案都是正确的,并且是同时提交的。很抱歉,我无法将两者都标记为正确。感谢您的宝贵时间!
【解决方案2】:

不要使用 DISTINCT,使用 group by:

$sql = "SELECT CONCAT(clients.studentFirstName, ' ', clients.studentLastName) AS name, appointments.location, appointments.subLocation, appointments.appointmentAddress1, appointments.appointmentAddress2, appointments.appointmentCity, appointments.appointmentState, appointments.appointmentZip, appointments.startTime, appointments.endTime, appointments.date, clients.school
                FROM appointments JOIN clients
                ON appointments.clientID = clients.clientID
                WHERE CONCAT(clients.studentFirstName, ' ', clients.studentLastName) = '".$roommate."' AND clients.school = '".$school."' group by CONCAT(clients.studentFirstName, ' ', clients.studentLastName);";

还要注意 $school 和 $roomate 中的 XSS(如果可以在外部访问)。

【讨论】:

  • 非常好的解决方案!我已经根据前两个答案将其切换为两个查询,但我下次一定会记住这一点!
【解决方案3】:

Distinct 与 ALL 列的整行相反,而不仅仅是名称部分...因此,如果约会的日期/时间、地点等不同,它们都会出现。如果您只想显示 NAME 部分,请删除其他内容的其余部分。在一个人被选中后查询可用的约会。

【讨论】:

  • 感谢您的回复,我会试试这个并回复您。
【解决方案4】:

你可以使用

group by name

最后,这将导致查询仅返回每个名称中的一个,但是您无法预测在客户有多个约会的情况下将返回什么约会结果,并且查询不再非常有用。

就像其他人指出的那样,您可能应该在选择客户后获取约会列表。

【讨论】:

    【解决方案5】:

    选择不同的 concat(....) 来自....

    【讨论】:

    • 好像和作者的问题没有太大区别。最好能澄清一下作者的代码有什么问题
    【解决方案6】:
    select colA||' - '||colB
    from table1
    where colA like 'beer%'
    group by colA||' - '||colB
    order by colA||' - '||colB
    ;
    

    【讨论】:

      【解决方案7】:

      我知道它的反应迟了,有人可能会发现这个用途已满

      CONCAT 之后尝试使用DISTINCT

      例子:

      $sql = SELECT CONCAT(DISTINCT clients.studentFirstName ...
      

      【讨论】:

      • 您只能将 DISTINCT 与组 concat 一起使用,而不仅仅是 concat
      【解决方案8】:
      SELECT DISTINCT MD5(CONCAT(clients.studentFirstName, ' ', clients.studentLastName)) as id, appointments.location, appointments.subLocation, ...
      

      【讨论】:

        猜你喜欢
        • 2011-07-20
        • 2014-12-23
        • 1970-01-01
        • 2018-04-28
        • 1970-01-01
        • 2019-12-20
        • 2021-12-04
        • 1970-01-01
        相关资源
        最近更新 更多