2010-10-06 56 views
0

我不是一个mysql大师,所以需要知道是否有办法让这个查询更快,更短,更紧凑。mysql short union

(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 all相对)做一个独特的排序,所以你不需要每个select子句中的不同。 2.你是外连接节点,但是你将谓词应用到n.type和n.status - 外连接因此是没有意义的 – 2010-10-06 06:54:45

回答

0

关于重写它的唯一方法就是做UNION你之前做了LEFT JOIN的:

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; 

的外连接的表,这可能节省双重扫描。另一方面,优化器可能会像这样优化它 - 虽然我怀疑它可能不会。用JOIN替换LEFT JOIN操作会提高性能 - 如果它不影响结果的准确性。这取决于你是否期望每行都有文件名 - 至少部分是这样。

+0

这样做的工作,谢谢。 – Djeux 2010-10-06 07:26:46