MySQL короткий союз

0

Я далек от того, чтобы быть гуру 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
  • 1
    1. union (в отличие от union all) делает сортировку по-разному, поэтому вам не нужны отличительные в каждом предложении select. 2. вы - внешнее соединение с узлом, и все же вы применяете предикаты к n.type и n.status - поэтому внешнее соединение бессмысленно
Теги:
union

1 ответ

0
Лучший ответ

О единственном способе переписать это сделать СОЮЗ, прежде чем делать ЛЕВЫЕ СОЕДИНЕНИЯ:

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 повысит производительность - если это не повлияет на точность результата. Это зависит от того, ожидаете ли вы, что имя файла для каждой строки или нет - по крайней мере частично.

  • 0
    Это сделало работу, спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню