如何在同一 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?