mysql短联
我远不是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)
(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-因此,外部连接是没有意义的