我有一个wordpress网站,用于存储各种课程(来自网站上的测验)的学生成绩。我正在尝试创建一个查询,该查询将为特定组中的所有学生(使用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_values,其meta_key为' grade'。它们存储为注释和comment_meta。
我希望这一切都清楚,你可以提供帮助。感谢。
在Ollie Jones的帮助下我做到了这一点:
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 :(得分:0)
这是熟悉的键/值存储问题,会出现commentmeta
,postsmeta
和usermeta
。当您JOIN
两个表而左侧的表可能没有相应的行时,您需要使用LEFT JOIN
。当左侧是键/值表时,您需要相应地调整ON
条件。最后,当您LEFT JOIN
两个表并且其中没有匹配的行时,您会返回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
答案 1 :(得分:0)
评论表中是否有user_id?我没看到你加入了哪个用户发布了哪个评论。因此,当您将group_members加入users表时,您指定要显示的用户,但由于您在加入评论表时未加入用户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'
希望这有帮助!