mysql union 出错_ORDER BY子句在MySQL中使用UNION时出错(Error with ORDER BY clause using UNION in MySQL)...

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 。 因此,它是顶级的,定义明确的。 使用最后一个表

...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值