2012-01-27 50 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

相關問題