2016-07-31 22 views
1

Ich habe eine Wordpress-Site, die verwendet wird, um Noten von Schülern in verschiedenen Lektionen zu speichern (aus den Tests auf der Website). Ich versuche, eine Abfrage zu erstellen, die alle Lektionen für alle Schüler einer bestimmten Gruppe (mit Buddypress-Gruppen) und die Noten der Schüler in jeder Lektion herauszieht.Ergebnisse erhalten, wenn Wert "Klasse" ist oder wo es nicht existiert

Ich habe diese Abfrage erstellt:

SELECT u.display_name, p.post_title, cm.meta_value 
FROM wp_users u 
JOIN wp_bp_groups_members gm 
    ON u.ID = gm.user_id 
JOIN wp_comments c 
    ON u.ID = c.user_id 
JOIN wp_commentmeta cm 
    ON c.comment_ID = cm.comment_id 
JOIN (SELECT * FROM wp_posts WHERE post_type LIKE 'lesson') p 
    ON c.comment_post_id = p.ID 
WHERE gm.group_id = 4 AND cm.meta_key LIKE 'grade' 

Das derzeit alle Qualitäten für alle Schüler in einer Gruppe gibt in den Lektionen, die sie den Test versucht haben. Es gibt jedoch keine Lektionen zurück, in denen sie den Test nicht versucht haben, was ich noch brauche.

Nur um klar zu sein: Lektionen sind Beiträge, Noten sind Metawerte in einem Datensatz mit einem Meta-Schlüssel von "Noten". Diese werden als Kommentare und comment_meta gespeichert.

Ich hoffe, das ist alles klar und Sie können helfen. Vielen Dank.

Nach Ollie Jones Hilfe habe ich dies:

SELECT u.display_name, p.post_title, IFNULL(cm.meta_value,'--nothing--') grade 
FROM wp_users u 
JOIN wp_comments c 
LEFT JOIN wp_commentmeta cm 
    ON c.comment_ID = cm.comment_id AND cm.meta_key = 'grade' 
JOIN wp_bp_groups_members gm 
    ON u.ID = gm.user_id 
JOIN wp_posts p 
    ON c.comment_post_id = p.ID 
WHERE gm.group_id = 4 AND p.post_type LIKE 'lesson' 

die fast funktioniert, aber alle Schülernoten gibt, nicht nur die, die in der Gruppe (obwohl es nur gibt den einen Namen der Schüler in der Gruppe) .

Antwort

0

Dies ist das bekannte Schlüssel/Wertspeicher-Problem, das mit commentmeta, postsmeta und usermeta auftritt. Wenn Sie JOIN zwei Tabellen und die linke möglicherweise keine entsprechende Zeile haben, müssen Sie LEFT JOIN verwenden. Wenn die linke eine Schlüssel/Wert-Tabelle ist, müssen Sie die Bedingung ON entsprechend anpassen. Schließlich, wenn Sie LEFT JOIN zwei Tabellen und es gibt keine passende Zeile in es, Sie erhalten NULLs für diese Spalten zurück, so müssen Sie dafür sorgen.

Also diese Art von SQL-Muster wird für Sie den Trick

SELECT whatever, IFNULL(cm.meta_value,'--nothing--') grade 
    FROM whatever 
    LEFT JOIN wp_comments c ON whatever.id = c.user_id 
    LEFT JOIN wp_commentmeta cm ON c.comment_id = cm.comment_id 
          AND cm.meta_key = 'grade' 
    JOIN whatever 
+0

Danke für die Hilfe, es hat mich definitiv näher gebracht. Ich habe meiner Frage einen Bearbeitungsschritt hinzugefügt, da ein Problem aufgetreten ist. – DanR

+0

Ich markiere das so korrekt, wie es mich zu der Antwort geführt hat. Ich musste links sowohl wp_comments und wp_commentmeta beitreten. Danke. – DanR

+0

ah, danke, dass du es herausgefunden hast. Ich habe meine Antwort aktualisiert. –

0

Gibt es eine user_id in Ihre Kommentare Tabelle? Ich sehe nicht, wo Sie sich angemeldet haben, welcher Benutzer welchen Kommentar gepostet hat. Wenn Sie also group_members der users-Tabelle beitreten, geben Sie an, welche Benutzer angezeigt werden sollen. Da Sie jedoch nicht der Benutzer-ID beitreten, wenn Sie der Kommentartabelle beitreten, werden alle Kommentare für alle Benutzer angezeigt. Ich bin nicht sicher, ob dies für Ihre Tabelle funktioniert, aber versuchen Sie:

SELECT u.display_name, p.post_title, IFNULL(cm.meta_value,'--nothing--') grade 
FROM wp_users u 
LEFT JOIN wp_comments c 
    JOIN wp_commentmeta cm 
    ON c.comment_ID = cm.comment_id AND cm.meta_key = 'grade' 
    JOIN wp_bp_groups_members gm 
    ON c.user_ID = gm.user_id 
ON u.user_id = c.user_id 
JOIN wp_posts p 
ON c.comment_post_id = p.ID 
WHERE gm.group_id = 4 AND p.post_type LIKE 'lesson' 

Hope this hilft!

+0

Das bringt uns zurück zum ursprünglichen Problem, leider nicht die Lektionen zu zeigen, wo ein Student den Test nicht versucht hat. – DanR

+0

Vielleicht müssen Sie Links zu Kommentaren auch wenn die Benutzer-ID beibehalten wird. Ich werde meine Antwort oben bearbeiten. – user6655061