ORDER BY子句在MySQL中使用UNION时出错(Error with ORDER BY clause using UNION in MySQL)
我在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,但它也不起作用。
任何建议或线索? 在此先感谢您的时间...
I have the following query in 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
If I delete ORBER BY and LIMIT, this query works fine... but the ORDER BY clause gives an error:
Table 'u' from one of the SELECTs cannot be used in global ORDER clause
If I delete the parentheses of both SELECT querys, the error is different:
Table 'u' from one of the SELECTs cannot be used in field list
I have also tried with UNION ALL, but it does not work either.
Any suggestion or clue? Thanks in advance for your time...
原文:https://stackoverflow.com/questions/50936278
更新时间:2019-11-29 17:36
最满意答案
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
The results of your UNION do not include any fields from table 'u', so those results cannot be sorted by table 'u' fields.
You could perhaps perform the UNION and then re-join the results to table 'u', and then use that to sort the results by table 'u' fields. A similar issue exists for sorting on course.fullname, so that would need to be joined back in, too.
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
2018-06-20
相关问答
潜在的障碍是SQL数据集本质上是无序的。 只要您使用UNION两个数据集,就会失去先前存在的订购保证。 您通常可以使用以下结构,但仍然无法保证...... SELECT
*
FROM
(
(
select to_char(first_name||'('||substr(last_name,0,1)||')')
from employees
order by first_name
)
Individuals
...
您可以通过在每个选择中添加一个名为rank的伪列,您可以先排序,然后再按其他条件进行排序,例如: select *
from (
select 1 as Rank, id, add_date from Table
union all
select 2 as Rank, id, add_date from Table where distance < 5
union all
select 3 as Rank, id, add_date from Table
...
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.
...
我认为最好使用子查询: SELECT *
FROM (SELECT NULL AS ID, '--None--' AS DSC
UNION ALL
SELECT MSP_NM AS ID, MSP_TITLE AS DSC
FROM MST_PAGE
WHERE MSP_STS = 'ACTIVE'
) t
ORDER BY ID;
你需要'ACTIVE'周围'ACTIVE'引号,你可以在没有子查询的情况下运行查询 - 我只是认为子查询澄
...
现在更多地看一下这个。 我认为你基本的查询可以消除这样的一些IN子句(但这不会起作用) SELECT e.entity_id,
GROUP_CONCAT((SELECT DISTINCT z.full_name FROM user z INNER JOIN entity_action ea ON z.id = ea.personnel_id WHERE ea.entity_id = e.id AND ea.action_type = 'some_action') ORDER BY
...
您可以使用用户定义的变量为每个单独的查询提供排名,因此第一行查询1的排名为1,类似地,第二行查询的第一行排名为1,然后是2,3,依此类推,然后排序这个行号的结果 SELECT bsb.ID AS meta_id, bsb.ORDER_ID AS order_item_id, '_product_id' AS meta_key, bsb.PRODUCT_ID AS meta_value, 1 AS origin
,@r:= @r +1 AS `row`
FROM b_sale_basket bsb,
...
看起来我明白了! PREPARE STMT FROM " SELECT * FROM tab_1 WHERE predict_var = '4' or predict_var = '2' union
(SELECT * FROM tab_1 WHERE predict_var = '0' or predict_var = '1' limit ? ) ORDER BY RAND() " ;
EXECUTE STMT USING @sample; # fetches a total of 13,
...
尝试: $getquery = "(SELECT *
FROM highscore
WHERE score >= '$score'
ORDER BY score ASC
LIMIT 6)
UNION ALL -- guaranteed to be beneficial in this case as Johan commented
(SELECT *
FROM highscore
WHERE score < '$score'
ORDER BY score DESC
LIMIT 5)";
...
该声明 select * from (select * from dual order by 1)
根本没有明确的订单。 只有最外层的ORDER BY在SQL中生效(除非设置了行限制)。 如果你仍然碰巧在查询结果中观察到顺序,那么这可能随时会消失。 在声明中 select * from dual
union all
select * from dual order by 1
order by附加到union all ,而不是第二个select 。 因此,它是顶级的,定义明确的。 使用最后一个表
...