2016-07-04 33 views
1

我嘗試寫一個小投票工具。我有3個表格:用戶,地點和選票。投票有2個外鍵(user_id和location_id)。mysql加入並協​​調不同表格

用戶(例如數據):

+----+----------+ 
| id | username | 
+----+----------+ 
| 5 | user1 | 
| 7 | user2 | 
| 11 | user3 | 
| 4 | user4 | 
| 12 | user5 | 
+----+----------+ 

位置:

+----+----------------+ 
| id | locationname | 
+----+----------------+ 
| 1 | Pasta   | 
| 2 | Burger   | 
| 3 | Pizza   | 
| 4 | Chinese  | 
| 5 | Thai   | 
+----+----------------+ 

投票:

+----+---------+-------------+------------+ 
| id | user_id | location_id | date  | 
+----+---------+-------------+------------+ 
| 30 |  5 |   1 | 2016-06-30 | 
| 31 |  5 |   1 | 2016-07-01 | 
| 32 |  7 |   1 | 2016-07-01 | 
| 38 |  11 |   2 | 2016-07-01 | 
| 39 |  4 |   1 | 2016-07-04 | 
| 41 |  12 |   3 | 2016-07-04 | 
| 44 |  5 |   4 | 2016-07-04 | 
| 46 |  7 |   5 | 2016-07-04 | 
+----+---------+-------------+------------+ 

的密鑰對日期&用戶是唯一的,以便用戶不能兩次投票。

我現在想爲CURDATE()像這樣的列表:

+----------------+----------------+----------------------+ 
| locationname | Votes   | Voters    | 
+----------------+----------------+----------------------+ 
| Pasta   | 3    | user1, user2, user x | 
| Burger   | 2    | user3, user4   | 
| Pizza   | 1    | user5    | 
| Chinese  | 1    | user6    | 
| Thai   | 0    |      | 
+----------------+----------------+----------------------+ 

我怎樣才能解決這個問題?試過類似的東西:

SELECT locations.locationname AS location, count(*) AS count, GROUP_CONCAT(users.username SEPARATOR ', ') AS Voters 
FROM votes 
INNER JOIN locations ON votes.location_id=locations.id 
    WHERE date = CURDATE() 
INNER JOIN users ON users.id=votes.user_id 
    WHERE location_id = "1" AND date = CURDATE() 
GROUP BY location_id 
ORDER BY count DESC; 

感謝

+0

GROUP_CONCAT的長度的限制,在1024個字符的默認值。如果你得到任何「大」票數,它會默默地截斷選民名單。加入是錯誤的。他們沒有'where'子句。在查詢中只能有一個「where」,並且它不會進入連接。 –

+0

好的謝謝。任何想法如何得到結果? – user3112086

+0

所以id是多餘的。只是說' – Strawberry

回答

0

我的一個朋友告訴我如何解決這個問題:

SELECT l.id AS locationid, l.locationname, count(username) AS count, GROUP_CONCAT(username SEPARATOR ", ") AS users 
FROM locations l 
LEFT JOIN votes v 
    ON v.location_id = l.id AND v.date = CURDATE() 
LEFT JOIN users u 
    ON v.user_id = u.id 
GROUP BY locationname 
ORDER BY count DESC;