2016-08-16 4 views
2

Ich versuche SELECT aus einer Tabelle und zählen aus zwei anderen Tabellen basierend auf den Zeilen aus der ersten Tabelle. Ich habe den folgenden Code ausprobiert, aber die Zeilen bleiben leer.Auswahl aus drei Tabellen

SELECT list.id, list.title, list.body, list.poster, list.created_at, count(comments.id) as comcount, count(supports.topic_id) as supcount 
FROM (
    SELECT * 
    FROM topics 
    ORDER BY created_at DESC 
    LIMIT 5 
) AS list, comments, supports 
WHERE 
    list.id = comments.id OR 
    list.id = supports.topic_id 

Durch in diesem Szenario Tabelle topics hat nur zwei Zeilen und Tabellen comments und supports haben keine Zeilen in ihnen, aber dennoch sollte ich in der Lage sein, sich zwei Reihen mit ihren Aliase supcount und comcount jeder Wert mit 0 als eine Ausgabe.

Ich habe die Lösung zu dem oben genannten, aber versuche etwas anderes mit der bereitgestellten Lösung, die ich im Kommentarbereich der bereitgestellten Lösung erklärte.

SELECT 
t.id, 
t.title, 
t.body, 
t.poster, 
t.created_at, 
s.supporter, 
IFNULL((SELECT COUNT(*) FROM comments c WHERE c.id = t.id), 0) AS comcount, 
IFNULL((SELECT COUNT(*) FROM supports s WHERE s.topic_id = t.id), 0) AS  supcount, 
CASE WHEN (s.supporter = "Davies Alex") THEN '1' ELSE '0' END sup, 
CASE WHEN (c.commenter = "Davies Alex") THEN '1' ELSE '0' END com 
FROM topics t, comments c, supports s 
ORDER BY created_at DESC 
+0

ist das falsch? list.id = comments.id, in der Kommentartabelle kann list_id stehen? –

+0

@GeorgeGarchagashashvili versuche, die 'id's in der Liste zu beiden' Kommentare' Tabelle und 'unterstützt' Tabelle –

+1

liefern Sie db Schema, Beispiel von Daten und erwartetes Ergebnis bitte sqlfiddle wäre perfekt – Alex

Antwort

1

wird Dies würde arbeiten, zu versuchen (mit Unterabfrage für nur zählen Einträge in einer anderen Tabelle besser geeignet):

SELECT 
    id, 
    title, 
    body, 
    poster, 
    created_at, 
    IFNULL((SELECT COUNT(*) FROM comments c WHERE c.id = t.id), 0) AS comcount, 
    IFNULL((SELECT COUNT(*) FROM supports s WHERE s.topic_id = t.id), 0) AS supcount 
FROM topics t 
ORDER BY created_at DESC 
LIMIT 5 

aktualisiert für neue Anforderung:

SELECT 
    t.id, 
    t.title, 
    t.body, 
    t.poster, 
    t.created_at, 
    s.supporter, 
    IFNULL(COUNT(c.id), 0) AS comcount, 
    IFNULL(COUNT(s.id), 0) AS supcount, 
    SUM(IF(s.supporter IS NOT NULL AND s.supporter = "Davies Alex", 1, 0)) > 0 AS sup, 
    SUM(IF(c.commenter IS NOT NULL AND c.commenter = "Davies Alex", 1, 0)) > 0 AS com 
FROM topics t 
LEFT JOIN comments c ON c.id = t.id 
LEFT JOIN supports s ON s.topic_id = t.id 
GROUP BY t.id 
ORDER BY created_at DESC 
+0

Angenommen, ich wollte etwas tun schwieriger, zum Beispiel wollte ich wissen, ob eine bestimmte 't.id' von einem bestimmten Benutzer unterstützt oder kommentiert wurde. Also versuche ich etwas in meinem neuen Schnitt. Bitte sehen Sie es sich an. –

+0

Sie möchten also Kommentare oder Unterstützungen zählen, wenn 'Davies Alex' der Autor des Kommentar/Support-Rechts ist? 0 sonst –

+0

Zählen der Kommentar und die Unterstützung ist getrennt. Der "CASE WHEN" ist zu bestimmen, ob ~ Davies Alex "dieses bestimmte Thema kommentiert oder unterstützt hat. –

0

In Ihrer Abfrage benötigen Sie list.id, um entweder comments.id oder supports.topic_id zu entsprechen. Wenn Sie einen Outer-Join verwenden, können Sie Daten aus der Initialtabelle abrufen, auch wenn die verknüpften Tabellen keine Daten enthalten oder enthalten.

SELECT 
    topics.id, topics.title, topics.body, topics.poster, list.created_at, 
    count(comments.id) as comcount, 
    count(supports.topic_id) as supcount 
FROM lists 
LEFT JOIN comments ON comments.id = topics.id 
LEFT JOIN supports ON supports.topic_id = topics.id 
ORDER BY created_at DESC 
LIMIT 5