【问题标题】:Mysql Left OUTER JOIN with Subquery (wordpress)Mysql Left OUTER JOIN with Subquery (wordpress)
【发布时间】:2015-06-29 21:36:37
【问题描述】:

我正在为 MYSQL 创建一个查询,它将从 4 个表中创建一个表。

SELECT xp.ID,
MAX((CASE WHEN (xum.meta_key = 'first_name') THEN xum.meta_value ELSE NULL END)) AS `first_name`,
MAX((CASE WHEN (xum.meta_key = 'last_name') THEN xum.meta_value ELSE NULL END)) AS `last_name`,
MAX((CASE WHEN (xum.meta_key = 'user_church') THEN xum.meta_value ELSE NULL END)) AS `church`,
MAX((CASE WHEN (xpm.meta_key = 'reg_user') THEN xpm.meta_value ELSE NULL END)) AS `user`,
MAX((CASE WHEN (xpm.meta_key = 'shirt_size') THEN xpm.meta_value ELSE NULL END)) AS `shirt_size`,
MAX((CASE WHEN (xpm.meta_key = 'reg_trip') THEN xpm.meta_value ELSE NULL END)) AS `trip_id`,
xp_2.post_title AS  'trip_name',
FROM xs_posts AS xp
LEFT OUTER JOIN xs_postmeta AS xpm ON xp.ID = xpm.post_id
LEFT OUTER JOIN xs_usermeta AS xum ON xum.user_id = (CASE WHEN (xpm.meta_key = 'reg_user') THEN xpm.meta_value ELSE NULL END )
LEFT OUTER JOIN xs_posts xp_2 ON xp_2.ID = (CASE WHEN (xpm.meta_key = 'reg_trip') THEN xpm.meta_value ELSE NULL END )
Where xp.post_type = 'trip_reg'
GROUP BY xp.ID

产生:

ID   - first_name - last_name- church - user - shirt_size - trip_id - trip_name
3025 - firstname -   lastname -   23  -   1  -    Large   -  2033  -    NULL

这些表是来自的基本 wordpress 表。我使用 wp_posts 表 2 次。

wp_usermeta wp_posts wp_postmeta

问题是我无法根据trip_id 获取要填充的行程名称。 IE triop_id 是一个帖子ID,我正在尝试从中获取帖子标题。该自定义帖子类型是 post_mission_trip。

如果我在末尾添加一个 Where 子句

AND xp_2.ID IS NOT NULL

我得到这个作为输出:

ID   - first_name - last_name- church - user - shirt_size - trip_id - trip_name
3025 -   NULL     -   NULL    - NULL  - NULL  -   NULL   -   2033   -  Trip Name

【问题讨论】:

    标签: mysql wordpress left-join


    【解决方案1】:

    只需将xp_2.post_title 包装在MAX() 聚合中。

      MAX(xp_2.post_title) AS `trip_name`
      ^^^^               ^
    

    问题是GROUP BY 正在折叠行,并且您从不确定的行中获取值。那是一个外连接,连接谓词是可以返回 NULL 的表达式(CASE 表达式)的相等性...

    MAX() 聚合将过滤掉 NULL 值,并得到一个非 NULL 值。返回 NULL 的唯一方法是所有行都有 NULL。)

    【讨论】:

    • 太完美了。谢谢!
    猜你喜欢
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多