mysql - 在 MySQL 中使用 UNION 的 ORDER BY 子句出错

标签 mysql sql sql-order-by union

我在 MySQL 中有以下查询:

(SELECT ue.id, ue.userid, ue.status, ue.timestart, ue.timeend, e.courseid,
        e.id AS enrolid, ra.roleid
 FROM user_enrolments ue
 JOIN enrol e ON e.id = ue.enrolid
 JOIN course c ON c.id = e.courseid
 JOIN user u ON u.id = ue.userid
 JOIN context ct ON ct.instanceid = c.id
 LEFT JOIN role_assignments ra ON ra.userid = u.id AND 
                               ra.contextid = ct.id AND
                               ra.itemid = e.id
 WHERE e.customint1 = 1 AND u.deleted = 0 AND 
       ct.contextlevel = 50 AND (ue.status = 0 OR ue.status = 1)) 

UNION

(SELECT de.enrolid AS id, de.userid, de.status, de.date_ini, de.date_fin, 
        de.courseid, de.enrolid, de.roleid
 FROM deleted_enrols de
 JOIN user u ON u.id = de.userid
 WHERE userid = ANY (SELECT userid FROM local_users WHERE clientid = 1))

ORDER BY u.firstname, u.lastname, c.fullname LIMIT 0, 100

如果我删除 ORBER BY 和 LIMIT,这个查询工作正常......但 ORDER BY 子句给出错误:

Table 'u' from one of the SELECTs cannot be used in global ORDER clause

如果我删除两个 SELECT 查询的括号,错误是不同的:

Table 'u' from one of the SELECTs cannot be used in field list

我也尝试过使用 UNION ALL,但它也不起作用。

有什么建议或线索吗?预先感谢您的时间...

最佳答案

UNION 的结果不包含表“u”中的任何字段,因此这些结果无法按表“u”字段排序。

您也许可以执行 UNION,然后将结果重新连接到表“u”,然后使用它按表“u”字段对结果进行排序。排序存在类似问题 course.fullname,因此也需要重新加入。

SELECT x.id, x.userid, x.status, x.timestart, x.timeend, x.courseid, x.enrolid, x.roleid
FROM ((SELECT ue.id, ue.userid, ue.status, ue.timestart, ue.timeend, e.courseid,
        e.id AS enrolid, ra.roleid
       FROM user_enrolments ue
         JOIN enrol e ON e.id = ue.enrolid
         JOIN course c ON c.id = e.courseid
         JOIN user u ON u.id = ue.userid
         JOIN context ct ON ct.instanceid = c.id
         LEFT JOIN role_assignments ra ON ra.userid = u.id 
           AND ra.contextid = ct.id 
           AND ra.itemid = e.id
       WHERE e.customint1 = 1 AND u.deleted = 0 
           AND ct.contextlevel = 50 AND (ue.status = 0 OR ue.status = 1)) 
       UNION
       (SELECT de.enrolid AS id, de.userid, de.status, de.date_ini, de.date_fin, 
        de.courseid, de.enrolid, de.roleid
        FROM deleted_enrols de
          JOIN user u ON u.id = de.userid
         WHERE userid = ANY (SELECT userid FROM local_users WHERE clientid = 1))
) x
  JOIN user z ON z.id = x.userid
  JOIN course d ON d.id = x.courseid
ORDER BY z.firstname, z.lastname, d.fullname LIMIT 0, 100

关于mysql - 在 MySQL 中使用 UNION 的 ORDER BY 子句出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50936278/

相关文章:

mysql - 带有 AUTO_INCREMENT 列的 MySQL 表中简单 SELECT 的默认顺序是什么

python - python 中的 SQL 问题

mysql - 从 SQL 中具有 SOME status=0 的表中选择所有信息

sql - 从带有时区列的时间戳中选择匹配日期

c# - 按 'Sector %' 排序对象列表,然后按顺序排列其他所有对象

php - 如何从数据库中获取包含类别的随机问题?

mysql - 如何使用 Mysql 用先前值的总和和新值更新 2 行值?

php - 如何在 while 循环中连接表中的两列值,如 -product_name(product_quantity), ..... 并存储在变量中

php - 如何在另一个 Query MySQL 上执行更新查询?

mysql - sql触发两个表不为空