MySQL: «Игнорировать», если во время JOIN отсутствует строка таблицы - PullRequest
0 голосов
/ 21 ноября 2010

Я делаю LEFT JOIN для трех таблиц, где таблица "time" не обязательно содержит соответствующие строки.Но если в этой таблице не найдено подходящих строк, связанные данные исчезают.

SELECT
    w.date AS worker_date,
    w.name AS worker_name,
    w.address AS worker_address,
    w.zip AS worker_zip,
    w.place AS worker_place,
    w.phone AS worker_phone,
    w.email AS worker_email,
    w.company AS worker_company,
    w.accessibility AS worker_accessibility,
    c.date AS client_date,
    c.name AS client_name,
    c.address AS client_address,
    c.zip AS client_zip,
    c.place AS client_place,
    c.phone AS client_phone,
    c.email AS client_email,
    c.web AS client_web,
    c.contact AS client_contact,
    j.date AS job_date,
    j.client_id,
    j.worker_id,
    j.name AS job_name,
    j.description AS job_description,
    j.type AS job_type,
    j.status AS job_status,
    j.proof AS job_proof,
    j.deadline AS job_deadline,
    j.price AS job_price,
    j.final_client AS job_final_client,
    SUM(t.hours) AS time_hours
FROM
    jobs AS j
LEFT JOIN (
    workers AS w,
    clients AS c,
    time AS t
) ON (
    w.id = j.worker_id AND
    c.id = j.client_id AND
    j.id = t.job_id
) GROUP BY
    j.id;

Как я могу заставить эту работу работать?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 21 ноября 2010

добавить

WHERE t.job_id IS NOT NULL до GROUP BY

Попробуйте заменить

SUM(t.hours) AS time_hours

до

(SELECT IFNULL(SUM(t.hours),0) FROM time WHERE time.job_id=j.job_id) AS time_hours

И убрать время из объединения

0 голосов
/ 13 сентября 2011

Я не уверен, что это проблема, но поведение запятых против JOIN изменилось после определенной версии MySQL.Попробуйте это

 ...
 FROM jobs AS j LEFT JOIN workers AS w ON w.id = j.worker_id
 LEFT JOIN clients AS c c.id = j.client_id
 LEFT JOIN `time` AS t ON j.id = t.job_id
 ... 

Также измените SUM с помощью IFNULL, как подсказывает @ajreal.

0 голосов
/ 21 ноября 2010

Я думаю, что ваш основной запрос правильный (с объединением под фигурными скобками)

Просто замените

SUM(t.hours) AS time_hours

на

SUM(if(t.hours is NULL,0,t.hours)) AS time_hours
...