当值为 'grade' 或不存在时获取结果

Get results when where value is 'grade' or where it doesn't exist

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

这是当前 return 组中所有学生在他们尝试测试的课程中的所有成绩。然而,它不会 return 任何他们没有尝试过的课程,我仍然需要这些课程。

明确一点:课程是帖子,成绩是 meta_values 在 meta_key 为 'grades' 的记录中。这些存储为评论,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'

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

这是熟悉的 key/value 存储问题,由 commentmetapostsmetausermeta 提出。当你JOIN两个table左边可能没有对应的行时,你需要使用LEFT JOIN。当左边是key/valuetable时,需要相应调整ON条件。最后,当您 LEFT JOIN 两个 table 并且其中没有匹配的行时,您会返回 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

你的评论里有user_id吗table?我看不到你在哪里加入了哪个用户发布了哪个评论。因此,当您将 group_members 加入用户 table 时,您指定要显示哪些用户,但是由于您在加入评论 table 时没有加入用户 ID,它将显示所有用户的所有评论。我不确定这是否适用于您的 table,但请尝试:

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'

希望对您有所帮助!