2012-01-27 49 views
4

所以我将这个SQL的结果提供给一个数组。该数组后来成为在输入时操作的文本框的建议。我希望它只返回每个名字1次,即使这个人有多个约会。目前,这将返回具有该名称的人员的所有约会,因此如果“Brad Robins”有5个约会,并且我开始键入“Brad”,则会在建议中显示“Brad Robins”5次,而不是仅显示一次。如何在同一个SQL语句中使用SELECT DISTINCT和CONCAT

$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不能很好地结合在一起。

+0

如果此查询的唯一目的是返回名称的列表作为建议提供给用户,并且你没有实际使用最终输出到您的程序中的约会表...您为什么首先加入它? – lyrisey 2012-01-27 01:50:12

+0

我稍后使用了其他信息,但很容易将其分开并执行两个查询,只留下第一个名称 – radleybobins 2012-01-27 02:00:28

回答

3

与所有列的整个行不同,不只是名称部分...所以如果约会在不同的日期/时间,地点等,他们都会出来。如果您想要显示的是NAME部分,请删除其他内容。在一个人被选中后查询可用的约会。

+0

谢谢你的回复,我会尽力回复你。 – radleybobins 2012-01-27 01:43:40

5

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

+1

感谢您的回复,我会尽力回复您。 – radleybobins 2012-01-27 01:44:01

+1

这两个答案都是正确的,并在同一时间提交。对不起,我不能标记正确。谢谢你的时间! – radleybobins 2012-01-27 01:58:25

+0

我也会为你投票,所以至少得10分+ ... – DRapp 2012-01-27 02:18:06

4

不要使用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);"; 

另外要小心XSS在$学校和$室友。

+0

非常好的解决方案!我已经根据前两个答案将它转换为两个查询,但我一定会记住下次! – radleybobins 2012-01-27 03:06:32

1

你可以使用

group by name 

末,这将导致查询只返回各自的名字之一,但你无法预测的任命结果将在情况下,客户端有被退回多个约会,并且查询停止非常有用。

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

0

SELECT DISTINCT CONCAT(....) 从....

+1

这与作者的问题没有多大区别。如果你澄清作者的代码有什么问题会更好 – bashnesnos 2017-03-06 12:09:55

相关问题