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

Complex Transformation & Joins Not Working

我遇到了一个复杂的 MySQL 查询。我试过加入,我试过使用 where X=Y 子句将多个 WordPress table 合并在一起。

我试图做的是导出 WordPress 用户,包括与来自另一个 table.

的 activity 信息合并的特定用户元数据

如果你不熟悉WordPress的table结构,这里是tables

相关内置的总结

_usermeta

umeta_id user_id meta_key meta_value
1 1 first_name Kevin
2 1 last_name Gee
3 1 ID_number 123456

_用户

ID user_login user_pass ... user_email ...
1 kevin ... ... kevin@example.com ...

_posts

ID ... post_title ...
1 ... Course Name ...

我们正在使用的插件是 Learn Dash,我们正在尝试从下面的 table

中提取 activity 信息

_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 course 1 1612283718 1614975038 1614975038
35 5 271 252 lesson 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

returntable 用户 ID 为

的所有已完成课程

但是,当我尝试在 user_id 的另一个连接上将这两个查询合并在一起以将所有内容组合在一起时,我要么超时查询,因为它永远不会结束,要么我得到一个永无止境的垃圾输出数据.

我的目的是生成一个像这样的 table

_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 Kevin Gee email_address 123456 Course 101 January 31, 2021
2 Test User email_address 654321 Course 101 February 1, 2021
1 Kevin Gee email_address 123456 Course 102 February 6, 2021

将这两个查询合并到 return 类似于我上面的 table 的有用信息的最佳方法是什么。这可以通过单个查询实现吗?

感谢您提供的任何建议!

您需要加入生物查询

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