2012-04-02 7 views
1

Ich habe ein Problem mit SQL-Abfrage. Ich brauche eine Liste von Benutzern zu bekommen. Das Problem ist die left join ich benutze. dies ist meine AbfrageWie bekomme ich gute Ergebnisse von DB

SELECT 
u.* 
FROM 
users u LEFT JOIN game g on g.user_id = u.user_id 
LEFT JOIN game_actions ga on ga.game_id = g.id 
LEFT JOIN emails e on e.id = ga.email_id 
WHERE 
u.user_id = 0 
AND u.is_contact_by_email = 1 
    AND email.type = 2 

diese Abfrage wegen der Join des gleichen Benutzer mehr als einmal kehrt mit anderen Tabellen i Diese Abfrage soll jeden Benutzer nur einmal zurückzukehren. Ich benutze SQL-Entwickler.

danke in fortgeschrittenen.

Antwort

0

Ich nehme an, dass es für jeden Benutzer mehr Spiele, Aktionen und E-Mails gibt. Wie stellst du dir die Ergebnis-Tabelle vor? Denn wenn Sie nur aus der Benutzertabelle (SELECT u.*) auswählen, ist es nicht sinnvoll, sich anderen anzuschließen. Wenn Sie die anderen Tabellen benötigen, verwenden Sie GROUP BY (u.user_id), um Zeilen nach Benutzer zu gruppieren.

+0

ich muss beitreten, ich aktualisierte meine Abfrage. – Ofer

1

Da Sie Spiele, Spieleaktionen oder E-Mails zu keinem Zweck verwenden (sie filtern keine Benutzer und Sie bereichern die Ergebnisse nicht mit Daten aus einer dieser Tabellen), müssen Sie nicht teilnehmen diese Tabellen überhaupt:

SELECT 
    u.* 
FROM users u 
WHERE u.user_id = 0 
    AND u.is_contact_by_email = 1 
+0

ich brauche diesen Join ... das Ende der Abfrage ist Und email.type = 2 – Ofer

1

Sie können Gruppenergebnis von user_id und verwenden aggregate functions andere Felder zurückzukehren, für eaxmple -

SELECT u.user_id, GROUP_CONCAT(g.game_id) games FROM users u 
    LEFT JOIN game g 
    ON g.user_id = u.user_id 
    LEFT JOIN game_actions ga 
    ON ga.game_id = g.id 
    LEFT JOIN emails e 
    ON e.id = ga.email_id 
WHERE 
    u.user_id = 0 AND u.is_contact_by_email = 1 
GROUP BY 
    u.user_id 
+0

+1 für 'GROUP_CONCAT()'. – glglgl

+0

GROUP_CONCAT funktioniert nicht, ich muss etwas spezielles dafür tun? – Ofer

+0

GROUP BY user_id zeigt eindeutige Benutzer an, dann müssen mehrere andere Datensätze (mit derselben Benutzer-ID) mit Aggregatfunktionen verarbeitet werden. Ich habe GROUP_CONCAT als Beispiel hinzugefügt, Sie können ein anderes verwenden - MAX, MIN, ... – Devart

0

Versuchen Stichwort verschiedene mit Ihrer Anfrage zu verwenden