2015-06-18 2 views
1

Я пытаюсь использовать следующий запрос, чтобы отфильтровать довольно большую таблицу и собрать данные о пользователях, у которых есть обновленные данные (таблица с идентификаторами пользователей для обновлений встроена в триггеры ala и очищена ежедневно). Таким образом, цель состоит в том, что возвращаемые данные в следующем формате:MySQL Left Join, производящий нулевые строки

+--------------------------------------------------------------------------------+ 
| web_contacts_id contact_id franchise_id last_transaction_date email | 
+--------------------------------------------------------------------------------+ 
|  1    23    1   1/1/15   [email protected]| 
|  2   null    null   null    null | 
|  ...   ...    ...   ...    ...  | 
+--------------------------------------------------------------------------------+ 

Таким образом, мы можем сказать, какие пользователи были обновлены, но не имели сделки еще.

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

+--------------------------------------------------------------------------------+ 
| web_contacts_id contact_id franchise_id last_transaction_date email | 
+--------------------------------------------------------------------------------+ 
|  1    23    1   1/1/15   [email protected]| 
|  null   null    null   null    null | 
|  ...   ...    ...   ...    ...  | 
+--------------------------------------------------------------------------------+ 

Я не знаю, почему left join устанавливает для всех значений значение null для строки, к которой он не может присоединиться, тем более, что для таблицы LEFT для этих пользователей есть web_contacts_id. Вот запрос, который я использую в настоящее время.

SELECT wcl.web_contacts_id, wcl.contact_id, wcl.franchise_id, wcl.last_transaction_date, wc.email 
FROM bl_updates bld 
LEFT JOIN (
    SELECT wcl.contact_id, wcl.franchise_id, wcl.web_contacts_id, wcl2.last_transaction_date 
    FROM web_contacts_location wcl 
    INNER JOIN (
     SELECT wcl_inner.web_contacts_id, MAX(wcl_inner.last_transaction_date) as last_transaction_date 
     FROM web_contacts_location as wcl_inner 
     WHERE web_contacts_id IN (
      SELECT id FROM bl_updates 
     ) 
     GROUP BY web_contacts_id 
    ) wcl2 on wcl.web_contacts_id = wcl2.web_contacts_id AND wcl.last_transaction_date = wcl2.last_transaction_date 
)wcl ON wcl.web_contacts_id = bld.id 
LEFT JOIN web_contacts wc on wc.id = wcl.web_contacts_id 

ответ

2

Все столбцы вы выбираете взяты из таблиц wcl и wc, поэтому, когда есть ряд в bld, что не имеет соответствия wcl строку, вы получите ряд null с.

Вы можете выбрать bld.id вместо wcl.web_contacts_id, чтобы получить хоть какое-то содержание в этих строках:

SELECT bld.id, wcl.contact_id, wcl.franchise_id, wcl.last_transaction_date, wc.email 
-- Here --^ 
FROM bl_updates bld 
LEFT JOIN (
    SELECT wcl.contact_id, wcl.franchise_id, wcl.web_contacts_id, wcl2.last_transaction_date 
    FROM web_contacts_location wcl 
    INNER JOIN (
     SELECT wcl_inner.web_contacts_id, MAX(wcl_inner.last_transaction_date) as last_transaction_date 
     FROM web_contacts_location as wcl_inner 
     WHERE web_contacts_id IN (
      SELECT id FROM bl_updates 
     ) 
     GROUP BY web_contacts_id 
    ) wcl2 on wcl.web_contacts_id = wcl2.web_contacts_id AND wcl.last_transaction_date = wcl2.last_transaction_date 
)wcl ON wcl.web_contacts_id = bld.id 
LEFT JOIN web_contacts wc on wc.id = wcl.web_contacts_id