Ваш код выполняет JOIN между Maintenance и Maintenace_parts. Первое, что вам нужно сделать, это преобразовать это в LEFT JOIN
FROM maintenance M
JOIN truck T ON t.truck_id=M.some_id
LEFT JOIN maintenance_parts P ON M.maintenance_id = P.maintenance_id
WHERE...
. После этого вы получите нулевые значения для каждого столбца вmaintenance_parts, если подходящая строка не найдена.Похоже, ваш код будет в порядке с этим, но убедитесь, что функция выбора и условия предложения MATCH правильно работают с NULL
Код для проверки / просмотра, который работает правильно с NULLS, следующий
OR MATCH( P.part_num, P.part_desc, P.part_ref) AGAINST( '$keywords' )
Вторая проблема заключается в том, что вы группируете по maintenance_id вместо truck_id .Попробуйте изменить поле GROUP BY, оно должно решить вашу вторую проблему
Пересмотренный запрос ниже
SELECT T.TRUCK_ID,M.maintenance_id, M.some_id, M.type_code, M.service_date,
M.mileage, M.mg_id, M.mg_type, M.comments, M.work_done,
MATCH( M.comments, M.work_done) AGAINST( '$keywords' ) +
IfNull(P.PartScore,0) +
MATCH( T.truck_number, T.make, T.model, T.engine, T.vin_number, T.transmission_number, T.comments) AGAINST( '$vehicle' )
AS score
FROM maintenance M,
JOIN
(SELECT Truck_id,truck_number, make, model, engine, vin_number, transmission_number,comments FROM Truck
UNION
SELECT Truck_id,truck_number, make, model, engine, vin_number, transmission_number,comments FROM Trailer
)
T
ON M.some_id=T.Truck_id
LEFT JOIN
(SELECT maintenance_id,SUM(MATCH( P.part_num, P.part_desc, P.part_ref) AGAINST( '$keywords' )) AS PartScore
FROM maintenance_parts
GROUP BY maintenance_id ) P
P ON M.maintenance_id = P.maintenance_id
WHERE M.type_code = 'truck'
AND (
(MATCH( T.truck_number, T.make, T.model, T.engine, T.vin_number, T.transmission_number, T.comments) AGAINST( '$vehicle' )
OR T.truck_number LIKE '%$vehicle%')
OR MATCH( P.part_num, P.part_desc, P.part_ref) AGAINST( '$keywords' )
OR MATCH( M.comments, M.work_done) AGAINST( '$keywords' )
)
AND M.status = 'A'
ORDER BY score DESC, maintenance_id DESC
LIMIT 0, $limit"