2014-01-14 3 views
0

Привет У меня есть база данных с 5 таблиц: пользователей, диски, клиентов, водителей, транспортных средств.результаты Mysql из нескольких таблиц, где идентификаторы соответствуют не появляются

И я пытаюсь взять все диски с их соответствующим водителем и клиентом. я придумал следующий запрос:

SELECT drives.id, 
drives.driver AS driver_id, 
CONCAT(LEFT(drivers.name, 1), '. ', drivers.surname) AS driver_name, 
drives.client AS client_id, 
CONCAT(LEFT(clients.name, 1), '. ', clients.surname) AS client_name, 
drives.vehicle AS vehicle_id, 
vehicles.license_plates AS license_plates, 
drives.departure, 
drives.destination, 
drives.distance, 
drives.type, 
drives.payment_type, 
drives.timestamp, 
drives.total, 
drives.expenses, 
drives.profit, 
CASE 
    WHEN DATE(drives.timestamp) < DATE(NOW()) AND drives.total > 0 THEN 'Completed' 
    WHEN DATE(drives.timestamp) < DATE(NOW()) AND drives.total = 0 THEN 'Overdue' 
    WHEN DATE(drives.timestamp) >= DATE(NOW()) THEN 
     CASE 
      WHEN drives.total = 0 THEN 'Pending' 
      WHEN drives.total > 0 THEN 'Prepaid' 
     END  
END AS payment_status, 
DATE_FORMAT(drives.timestamp, '%d-%m-%Y %H:%i:%s') AS 'stamp' 
FROM drives, clients, drivers, vehicles WHERE 
drives.driver = drivers.id AND 
drives.client = clients.id AND 
drives.vehicle = vehicles.id AND 
drives.user = '146' ORDER BY id ASC LIMIT 9999999999 OFFSET 0 

Все отлично работает, однако если удалить запись транспортного средства из таблицы транспортных средств, а затем попытаться извлечь все приводные записи из таблицы дисков, приводных записей, которые были диски. vehicle = vehicle.id (который больше не существует) не будет распечатан.

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

данных таблицы накопителей:

id timestamp    user driver client vehicle departure destination distance type  payment_type total expenses profit note 
1 2013-02-14 10:33:26  146  1  1  1  Address 1 Address 2 0   Deprature Cash   0  0   0  hello world 

ответ

2

Вы используете INNER JOIN, рассмотреть возможность использования OUTER JOIN

... 
FROM drives 
LEFT OUTER JOIN clients ON drives.client = clients.id 
LEFT OUTER JOIN drivers ON drives.driver = drivers.id 
LEFT OUTER JOIN vehicles ON drives.vehicle = vehicles.id 
WHERE 
.... 
+0

Могу ли я спросить, есть ли «ON» missi ng из последнего соединения? – Syd

+0

Уверен, должно быть включено –

+0

Ок, thnx работает как шарм :) – Syd

0

Вы должны использовать JOINS здесь, это, несомненно, поможет для захвата NULL значения, LEFT JOIN должны помочь

SELECT DRI.id, DRI.driver AS driver_id, CONCAT(LEFT(DI.name, 1), '. ', DI.surname) AS driver_name, 
DRI.client AS client_id, CONCAT(LEFT(CI.name, 1), '. ', CI.surname) AS client_name, 
DRI.vehicle AS vehicle_id, vehicles.license_plates AS license_plates, DRI.departure, 
DRI.destination, DRI.distance, DRI.type, DRI.payment_type, DRI.timestamp, DRI.total, 
DRI.expenses, DRI.profit, 
CASE 
    WHEN DATE(DRI.timestamp) < DATE(NOW()) AND DRI.total > 0 THEN 'Completed' 
    WHEN DATE(DRI.timestamp) < DATE(NOW()) AND DRI.total = 0 THEN 'Overdue' 
    WHEN DATE(DRI.timestamp) >= DATE(NOW()) THEN 
     CASE 
      WHEN DRI.total = 0 THEN 'Pending' 
      WHEN DRI.total > 0 THEN 'Prepaid' 
     END  
END AS payment_status, 
DATE_FORMAT(DRI.timestamp, '%d-%m-%Y %H:%i:%s') AS 'stamp' 
FROM drives DRI 
LEFT JOIN clients CI ON DRI.client = CI.id 
LEFT JOIN drivers DI ON DRI.driver = DI.id, 
LEFT JOIN vehicles VI ON DRI.vehicle = VI.id 
WHERE 
DRI.user = '146' 
ORDER BY DRI.id ASC 
+0

sql дает мне следующую ошибку: # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса, используемого рядом с «LEFT JOIN vehicles» VI ON DRI.vehicle = vehicles.id WHERE drives.user = '146' ORD 'в строке 19 – Syd

+0

Обновлен запрос, можете ли вы попробуй – rsakhale

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