如何在同一 SQL 语句中使用 SELECT DISTINCT 和 CONCAT

Posted

技术标签:

【中文标题】如何在同一 SQL 语句中使用 SELECT DISTINCT 和 CONCAT【英文标题】:How to use SELECT DISTINCT and CONCAT in the same SQL statement 【发布时间】: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 似乎并没有很好地结合在一起。

【问题讨论】:

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

【讨论】:

以上是关于如何在同一 SQL 语句中使用 SELECT DISTINCT 和 CONCAT的主要内容,如果未能解决你的问题,请参考以下文章

请问如何使用SQL语句查询同一张表中互为相反数的两条记录!如A1=500,A2=-500,如何写SQL语句

操作方法:如何使用 SQL SELECT JOIN 提取最新记录

如何在同一个 SELECT 语句中使用 DISTINCT 和 ORDER BY?

如何在 SQL SELECT 语句中使用包常量?

如何在 PL/SQL 中使用 select 语句为 SQL*Plus 变量赋值?

SQL 如何查询日期在一定范围内的数据