当值为 '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 存储问题,由 commentmeta
、postsmeta
和 usermeta
提出。当你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'
希望对您有所帮助!
我有一个 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 存储问题,由 commentmeta
、postsmeta
和 usermeta
提出。当你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'
希望对您有所帮助!