2013-10-25 4 views
0

В настоящее время я работаю над некоторыми унаследованными системами, и я наткнулся на кусок SQL написано вот так:Пожалуйста, объясните SQL присоединиться

SELECT 
    cel.id, 
    cel.campaign_id, 
    cel.campaign_name, 
    cel.campaign_message_type, 
    cel.responsible_user_id, 
    cel.responsible_user_full_name, 
    cel.person_id, 
    cel.email_template_id, 
    cel.email_message_subject, 
    cel.recipient_list_name, 
    cel.first_name, 
    cel.last_name, 
    cel.email_address, 
    b.message_content_html email_message_content_html, 
    b.message_content_text email_message_content_text, 
    b.course_presentation_id, 
    cp.phone_mobile 
FROM 
    campaigns_email_logs cel 

    LEFT JOIN contacts_people cp ON 
     (cel.person_id = c.id), 
     campaigns_email b 
WHERE 
    cel.campaign_id = b.id and 
    cel.status = 'queued' and 
    cel.datetime_start < now() and 
    cel.datetime_end > now() and 
    b.paused = 'no' 
order by 
    {$campaignMessagesToSendOrdering}; 

Пожалуйста, вы можете объяснить то, что LEFT JOIN campaigns_email делает? Выполняет ли это перекрестное соединение на контактах_people? Для меня это можно быстро понять, если кто-нибудь, пожалуйста, перепишет его без, campaign_email.

Я знаю, что вы можете иметь несколько таблиц в своем предложении from, но я никогда не видел его так.

Спасибо.

+0

Здесь никто не будет делать вашу работу за вас, здесь люди помогут вам найти решения проблем, которые вы пытались решить. По крайней мере, проверьте Dokumentation перед тем, как обратиться за помощью [Join Doku MySql] (http://dev.mysql.com/doc/refman/5.1/de/join.html) –

+0

@winner_joiner, где в вопросе он просит вас сделать его работа для него? – jerdiggity

+0

'любой, пожалуйста, перепишите его без, campaign_email.' - переписывание запроса без этого соединения означает не более чем удаление этого из запроса:', campaign_email b' – AD7six

ответ

3

Этот запрос имеет LEFT JOIN и CROSS JOIN (с использованием "comma syntax").

Соответствующая часть семантический идентичен:

FROM campaigns_email_logs cel 
LEFT JOIN contacts_people cp ON (cel.person_id = cp.id) 
CROSS JOIN campaigns_email b 

Итак, теперь, когда мы установили, что в качестве CROSS JOIN, давайте условие во внимание:

WHERE2 cel.campaign_id = b.id .. 

Boom. Прямо там мы превратили эту ПЕРЕКРЕСТКУ в INNER JOIN. Переписка:

FROM campaigns_email_logs cel 
LEFT JOIN contacts_people cp ON (cel.person_id = cp.id) 
JOIN campaigns_email b ON (cel.campaign_id = b.id) 
+0

Спасибо всем за помощь. Невероятный ответ. Я думал, что это может быть крест - я никогда не видел, чтобы это было так. Извините, опечатка «c.id» должна быть «cp.id». Я должен был сделать это немного читаемым и забыл обновить это. –

0

campaigns_email не осталось ни к чему.

В пункте FROM у вас есть JOIN между campaigns_email_logs и contacts_people. Затем у вас есть продукт с корзиной с результатом этого соединения и campaigns_email.

Смежные вопросы