复杂的转换和连接不起作用

问题描述

我被一个复杂的 MysqL 查询难住了。我尝试过连接,并尝试使用 where X=Y 子句将多个 wordpress 表合并在一起。

我试图做的是导出 wordpress 用户包括与另一个表中的活动信息合并的特定用户元数据。

如果你不熟悉wordpress的表结构,这里是相关内置表的总结

_userMeta

uMeta_id user_id Meta_key 元值
1 1 名字 凯文
2 1 姓氏
3 1 身份证号码 123456

_users

ID 用户登录 user_pass ... user_email ...
1 凯文 ... ... kevin@example.com ...

_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