2016-07-31 13 views
1

私は、さまざまなレッスン(学生のクイズから)で学生の成績を保存するために使用されるワードプレスサイトを持っています。私は特定のグループ(buddypressグループを使用)のすべての生徒と各レッスンの生徒のレッスンをすべて取り出すクエリを作成しようとしています。値が「グレード」または存在しない場合の結果を取得

私はこのクエリを作成しました:

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' 

これは、現在彼らはテストを試みたレッスンで、グループ内のすべての学生のための全学年を返します。しかし、まだ試したことがないレッスンは返されません。

レッスンは投稿で、成績はmeta_keyが '成績'のレコードのmeta_valuesです。これらはコメントとして保存され、comment_meta。

これはすべて明確であり、助けてくれることを願っています。ありがとう。

Ollie第ジョーンズ助けた後、私はこの作られた:(それが唯一のグループの学生の1名を与えますが)

ほぼすべての生徒の成績を動作しますが、返す
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' 

、グループ内だけでなく、ものを。

答えて

0

これは、おなじみのキー/値ストアの問題で、commentmeta,postsmeta、およびusermetaとなります。 JOIN 2つのテーブルと左側に対応する行がない場合は、LEFT JOINを使用する必要があります。左の値がキー/値テーブルの場合は、ONの条件を適切に調整する必要があります。最後に、LEFT JOINテーブルが2つあり、一致する行がない場合は、それらの列にはNULLsが返されます。そのため、許可する必要があります。

だから、SQLパターンのこの種は、あなた

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

助けてくれてありがとうございました。 1つの問題が発生したので、私は自分の質問に編集を追加しました。 – DanR

+0

私はこれを正しいものとしてマークしています。 wp_commentsとwp_commentmetaの両方に参加する必要がありました。ありがとうございます。 – DanR

+0

ああ、それを理解してくれてありがとう。私は自分の答えを更新しました。 –

0

のためのトリックを行いますコメントテーブル内のuser_idはありますか?どのユーザーがどのコメントに投稿したかはわかりません。だから、あなたがusersテーブルにgroup_membersを参加させるとき、表示するユーザを指定していますが、コメントテーブルに参加するときにユーザIDに参加していないので、すべてのユーザのすべてのコメントが表示されます。あなたのテーブルでこれが動作するかどうかは分かりませんが、試してみてください:

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' 

+0

これは、残念ながら、学生がテストを試みなかったレッスンを表示しないという元の問題に戻ります。 – DanR

+0

おそらく、ユーザーIDが保持されている場合は、コメントにも参加する必要があります。私は上記の私の答えを編集します。 – user6655061

関連する問題