2010-10-06 76 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