2016-07-04 7 views
1

Ich versuche, ein kleines Voting-Tool zu schreiben. Ich habe 3 Tabellen: Benutzer, Standorte und Stimmen. votes hat 2 Fremdschlüssel (user_id und location_id).Mysql Beitritt und Verkettung verschiedener Tabellen

Benutzer (Beispieldaten):

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

Orte:

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

Stimmen:

+----+---------+-------------+------------+ 
| 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 | 
+----+---------+-------------+------------+ 

Die Keypair Datum & Benutzer eindeutig ist so ein Benutzer stimmen kann nicht zweimal .

ich jetzt eine Liste, wie dies für CURDATE() haben wollen:

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

Wie kann ich dieses Problem lösen? Versucht, etwas wie folgt aus:

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; 

Dank

+0

Group_concat hat eine Längenbegrenzung, die standardmäßig auf 1024 Zeichen. Wenn Sie eine "große" Anzahl von Stimmen erhalten, wird es still die Liste der Wähler abschneiden. Und Joins sind falsch. sie haben keine 'where' Klauseln. Sie können nur eine Wo in einer Abfrage haben und sie wird nicht in die Joins übernommen. –

+0

ok danke. Irgendeine Idee wie ich zu dem Ergebnis komme? – user3112086

+0

Also ID ist redundant. Sayin ' – Strawberry

Antwort

0

Ein Freund von mir hat mir gezeigt, wie dieses Problem zu lösen:

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; 
Verwandte Themen