在价值等级为'时获得结果或者它不存在的地方

时间:2016-07-31 09:20:34

标签: mysql wordpress left-join key-value buddypress

我有一个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'

这几乎有效,但会返回所有学生成绩,而不仅仅是小组中的成绩(尽管它只给出了小组中学生的一个名字)。

2 个答案:

答案 0 :(得分:0)

这是熟悉的键/值存储问题,会出现commentmetapostsmetausermeta。当您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'

希望这有帮助!