2015-06-29 3 views
0

Я создаю запрос для MYSQL, который создаст таблицу из 4 таблиц.Mysql Left OUTER JOIN with Subquery (wordpress)

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 - это идентификатор сообщения, и я пытаюсь получить от него заголовок. Этот пользовательский тип сообщения - post_mission_trip.

Если добавить где положение в конце

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 

ответ

0

Просто оберните xp_2.post_title в MAX() агрегата.

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

Проблема заключается в том, что GROUP BY рушится строк, и вы получаете значение из неопределенного ряда. Это внешнее объединение, а предикат объединения - это равенство в выражении, которое может возвращать NULL (выражение CASE) ...

Агрегат MAX() будет отфильтровывать значения NULL и получить значение, отличное от NULL. Единственный способ получить возвращаемый NULL будет, если все строки имеют NULL.)

+0

Это было идеально. Благодаря! – Justin