Я далек от того, чтобы быть гуру mysql, поэтому вам нужно знать, есть ли способ сделать этот запрос быстрее, короче и компактнее.
(SELECT DISTINCT(cfrm.nid), f.filename, n.title, n.created
FROM content_field_raamatu_marksonad cfrm
LEFT JOIN node n ON (n.nid = cfrm.nid)
LEFT JOIN content_field_kaanepilt cfk ON (cfk.nid = n.nid)
LEFT JOIN files f ON (f.fid = cfk.field_kaanepilt_fid)
WHERE n.type = 'raamat'
AND n.status = 1
AND cfrm.field_raamatu_marksonad_value IN (102, 3348))
UNION
(SELECT DISTINCT(cfrt.nid), f.filename, n.title, n.created
FROM content_field_raamatu_teema cfrt
LEFT JOIN node n ON (n.nid = cfrt.nid)
LEFT JOIN content_field_kaanepilt cfk ON (cfk.nid = n.nid)
LEFT JOIN files f ON (f.fid = cfk.field_kaanepilt_fid)
WHERE n.type = 'raamat'
AND n.status = 1
AND cfrt.field_raamatu_teema_value = 1342)
ORDER BY `created` DESC
О единственном способе переписать это сделать СОЮЗ, прежде чем делать ЛЕВЫЕ СОЕДИНЕНИЯ:
SELECT DISTINCT x.nid, f.filename, n.title, n.created
FROM (SELECT DISTINCT cfrm.nid
FROM content_field_raamatu_marksonad AS cfrm
WHERE cfrm.field_raamatu_marksonad_value IN (102, 3348)
UNION
SELECT DISTINCT cfrt.nid
FROM content_field_raamatu_teema AS cfrt
WHERE cfrt.field_raamatu_teema_value = 1342) AS x
LEFT JOIN node AS n ON n.nid = x.nid
LEFT JOIN content_field_kaanepilt AS cfk ON cfk.nid = n.nid
LEFT JOIN files AS f ON f.fid = cfk.field_kaanepilt_fid
WHERE n.type = 'raamat'
AND n.status = 1
ORDER BY n.created DESC;
Это может спасти двойное сканирование внешних соединенных таблиц. С другой стороны, оптимизатор может так или иначе оптимизировать его, хотя я подозреваю, что, вероятно, этого не произойдет. Замена операций LEFT JOIN с помощью JOIN повысит производительность - если это не повлияет на точность результата. Это зависит от того, ожидаете ли вы, что имя файла для каждой строки или нет - по крайней мере частично.