问题描述
我被一个复杂的 MysqL 查询难住了。我尝试过连接,并尝试使用 where X=Y 子句将多个 wordpress 表合并在一起。
我试图做的是导出 wordpress 用户,包括与另一个表中的活动信息合并的特定用户元数据。
如果你不熟悉wordpress的表结构,这里是相关内置表的总结
_userMeta
_users
_posts
ID | ... | post_title | ... |
---|---|---|---|
1 | ... | 课程名称 | ... |
我们使用的插件是Learn Dash,我们正在尝试从下表中提取活动信息
_learndash_user_activity
activity_id | user_id | post_id | course_id | activity_type | activity_status | activity_started | activity_completed | activity_updated |
---|---|---|---|---|---|---|---|---|
34 | 5 | 252 | 252 | 课程 | 1 | 1612283718 | 1614975038 | 1614975038 |
35 | 5 | 271 | 252 | 课 | 1 | 1612283818 | 1614976038 | 1614975034 |
为了将元数据转换为有用的东西,我知道我可以做这样的事情,这让我得到用户的姓名、ID 信息和电子邮件地址
SELECT _userMeta.user_id,MAX(CASE WHEN _userMeta.Meta_key = "first_name" THEN _userMeta.Meta_value END) "First Name",MAX(CASE WHEN _userMeta.Meta_key = "last_name" THEN _userMeta.Meta_value END) "Last Name",MAX(CASE WHEN _userMeta.Meta_key = "ID_number" THEN _userMeta.Meta_value END) "ID Number",_users.user_email as "Email Address"
FROM _userMeta
JOIN _users on _userMeta.user_id = _users.ID
GROUP BY _userMeta.user_id
而且,我可以像这样获取完成的课程信息
SELECT
_learndash_user_activity.user_id as "User ID",_posts.post_title as "Course Name",FROM_UNIXTIME(_learndash_user_activity.activity_completed) as "Completed Timestamp"
FROM _learndash_user_activity
JOIN _posts on _learndash_user_activity.post_id = _posts.ID
WHERE
_learndash_user_activity.activity_type = 'course' AND
_learndash_user_activity.activity_status = 1 AND
_learndash_user_activity.activity_completed IS NOT NULL
返回包含用户 ID 的所有已完成课程的表格
但是,当我尝试将这两个查询合并到另一个用于 user_id 的 join 以将所有内容组合在一起时,我要么使查询超时,因为它永远不会结束,要么我得到永无止境的数据的垃圾输出。
我的目的是生成这样的表格
_output
_userMeta.user_id | _userMeta.Meta_key(first_name) | _userMeta.Meta_key(last_name) | _users.user_email | _userMeta.Meta_key(id_number) | _posts.post_title | _learndash_user_activity.activity_completed |
---|---|---|---|---|---|---|
1 | 凯文 | 呸 | 电子邮件地址 | 123456 | 课程 101 | 2021 年 1 月 31 日 |
2 | 测试 | 用户 | 电子邮件地址 | 654321 | 课程 101 | 2021 年 2 月 1 日 |
1 | 凯文 | 呸 | 电子邮件地址 | 123456 | 课程 102 | 2021 年 2 月 6 日 |
合并这两个查询以返回类似于上表的有用信息的最佳方法是什么。这可以通过单个查询实现吗?
感谢您提供的任何建议!
解决方法
您需要加入 bioth 查询
SELECT
t1.user_id,t1.`First Name`,t1.`Last Name`,t1.`ID Number`,t2.`Course Name`,t2.`Completed Timestamp`
FROM
(SELECT _usermeta.user_id,MAX(CASE WHEN _usermeta.meta_key = "first_name" THEN _usermeta.meta_value END) "First Name",MAX(CASE WHEN _usermeta.meta_key = "last_name" THEN _usermeta.meta_value END) "Last Name",MAX(CASE WHEN _usermeta.meta_key = "ID_number" THEN _usermeta.meta_value END) "ID Number",_users.user_email as "Email Address"
FROM _usermeta
JOIN _users on _usermeta.user_id = _users.ID
GROUP BY _usermeta.user_id) t1
JOIN
(SELECT
_learndash_user_activity.user_id as "User ID",_posts.post_title as "Course Name",FROM_UNIXTIME(_learndash_user_activity.activity_completed) as "Completed Timestamp"
FROM _learndash_user_activity
JOIN _posts on _learndash_user_activity.post_id = _posts.ID
WHERE
_learndash_user_activity.activity_type = 'course' AND
_learndash_user_activity.activity_status = 1 AND
_learndash_user_activity.activity_completed IS NOT NULL) te ON t1.user_id = t2.user_id