代码之家  ›  专栏  ›  技术社区  ›  Christophe

mysql联合查询w/左连接顺序错误?

  •  4
  • Christophe  · 技术社区  · 15 年前

    我们有一个工会查询。下面是一个基本的(类似的)例子:

    SELECT a.Name, b.Info
    FROM a 
    LEFT JOIN b ON (a.ID = b.ID) 
    WHERE a.Name LIKE "a%"
    UNION
    SELECT a.Name, b.Info 
    FROM a
    LEFT JOIN b ON (a.ID = b.ID)
    WHERE a.Name LIKE "b%"
    ORDER BY a.Name, b.Info;
    

    我收到一个错误,上面写着“order子句中的未知列‘b.info’”。

    当我从order by子句末尾删除“b.info”时,它就工作了。

    思想?

    4 回复  |  直到 11 年前
        1
  •  3
  •   Ian    15 年前

    orderby将应用于合并的结果集-在联合发生之后。此时,可以说只有一个表,因此对b.info的引用将无效。

    SELECT a.Name AS 'NameCol', b.Info AS 'InfoCol' FROM a LEFT JOIN b ON (a.ID = b.ID) WHERE 
    a.Name LIKE "a%" UNION SELECT a.Name AS 'Name', b.Info AS 'Info' FROM a LEFT JOIN b ON
    (a.ID = b.ID) WHERE a.Name LIKE "b%" ORDER BY NameCol, InfoCol;
    

    请注意,这可能非常慢(结果集很大),因为您正在强制mysql使用临时表进行排序操作。

        2
  •  3
  •   michaelk    15 年前

    mysql文档(12.2.8.3)描述了这个问题 联合 语法)。不能使用原始的表名,所以给每个列一个别名,并在 按顺序 条款:

    使用一个 订购 极限 子句来排序或限制整个 联合 结果,用圆括号括住 选择 陈述和放置 按顺序 极限 最后一次之后。以下示例同时使用这两个子句:

    (SELECT a FROM t1 WHERE a=10 AND B=1)
    UNION
    (SELECT a FROM t2 WHERE a=11 AND B=2)
    ORDER BY a LIMIT 10;
    

    这种类型的 按顺序 不能使用包含表名的列引用(即tbl_name.col_name格式的名称)。相反,在第一个 选择 语句并引用 订购 .

        3
  •  1
  •   Walf    14 年前

    你为什么要用工会?此查询相同且速度更快:

    SELECT a.Name, b.Info FROM a LEFT JOIN b ON a.ID = b.ID
    WHERE (a.Name LIKE "a%" OR a.Name LIKE "b%") ORDER BY a.Name, b.Info;
    

    读括号

        4
  •  0
  •   Michael Krelin - hacker    15 年前

    我想当你在做的时候 UNION 查询应指定列位置,而不是 ORDER BY 条款。尝试 ORDER BY 1,2 .