mysql短联

mysql短联,sql,mysql,union,Sql,Mysql,Union,我远不是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)

我远不是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;
这可能会保存外部联接表的双重扫描。另一方面,优化器可能会这样优化它——尽管我怀疑它可能不会。如果不影响结果的准确性,用联接替换左联接操作将提高性能。这取决于您是否希望每一行都有一个文件名,至少部分是这样。

1。union(与UNIONALL相反)执行一个distinct排序,因此不需要在每个select子句中使用distinct。2.您正在外部连接到节点,但您正在将谓词应用到n.type和n.status-因此,外部连接是没有意义的