使用union更改结果的mysql顺序

hl0ma9xz  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(332)

所以我从我的第一个选择中得到10个结果,在联合后从另一个中得到1个结果,如下所示:

(SELECT    a.*,
            b.*
FROM        all a,
            names b
WHERE       b.name_id = a.name_id
ORDER   BY name_id DESC
LIMIT   10)
UNION
(SELECT a.*,
            b.*
FROM        all a,
            names b
WHERE       b.name_id = a.name_id
ORDER   BY request_id ASC
LIMIT   1)

我想把第二次选择的结果作为第二次选择的最后一个结果


********

name_id 100
name_id 99
name_id 98
name_id 97
name_id 96
name_id 95
name_id 94
name_id 93
name_id 92
name_id 1 <- second select result as second last result
name_id 91

********

有人能帮忙吗?

8gsdolmq

8gsdolmq1#

合成查询的行号列,并根据需要调整位置。

SELECT x.name
         , x.name_id
      FROM (
            SELECT @rownum:=@rownum + 1 as row_number, 
                   t.name,
                   t.name_id
            FROM ( 
                -- original query from the question starts here
                (SELECT     b.name,
                            a.name_id
                FROM        allx a,
                            names b
                WHERE       b.name_id = a.name_id
                ORDER   BY name_id DESC
                LIMIT   10)
                UNION
                (SELECT     b.name,   
                            a.name_id 
                FROM        allx a,
                            names b
                WHERE       b.name_id = a.name_id
                ORDER   BY request_id ASC
                LIMIT   1)
            ) t,
            (SELECT @rownum := 0) r
           ) x
  ORDER BY CASE row_number
              WHEN 10 THEN 11
              WHEN 11 THEN 10
              ELSE row_number
           END
         ;

(注意,为了避免语法错误/支持demo:table,对查询进行了细微的修改 all 已命名 allx ,联合子查询的显式投影)。
这会很快变得复杂,因此在临时报告之后,最好在联合的子查询中合成一个反映全局顺序的属性。
此处演示(sql fiddle)
信用
行数取自此so答案

g6baxovj

g6baxovj2#

提出了一个有趣的问题

+----+--------+
| id | sname  |
+----+--------+
|  1 | sname1 |
|  2 | sname2 |
|  3 | sname3 |
|  4 | sname4 |
|  5 | sname5 |
|  6 | sname6 |
+----+--------+
6 rows in set (0.001 sec)

(select id,sname,@r:=@r+1 rn
from users 
cross join(select @r:=0) r
order by sname desc limit 3
) 
union 
(
select u.id,u.sname,
    @r:=@r - .9
    from users u
    left join (select id from users order by sname desc limit 3) u1 on u1.id = u.id
    where u1.id is null
    order by u.id asc limit 0,1 
)
order by rn;

在第一个子查询中使用一个变量来计算行号的情况下,由于该变量在第二个子查询中没有重置,因此一个简单的算法可以计算出第二个子查询结果的位置。注意,第二个子查询使用左连接来检查结果是否尚未出现在第一个子查询中,

lf3rwulv

lf3rwulv3#

我建议 union all 有三种选择:

SELECT an.*
FROM ((SELECT a.*, n.*, 1 as ord
       FROM all a JOIN
            names n
            ON  n.name_id = a.name_id
      ORDER BY n.name_id DESC
      LIMIT 9
     ) UNION ALL
     (SELECT a.*, n.*, 3 as ord
       FROM all a JOIN
            names n
            ON  n.name_id = a.name_id
      ORDER BY n.name_id DESC
      LIMIT 9 OFFSET 9
     ) UNION ALL
     (SELECT a.*, b.*
      FROM all a JOIN
           names n
      WHERE n.name_id = a.name_id
     ORDER BY request_id ASC
     LIMIT 1
    )
   ) an
ORDER BY ord, name_id;

相关问题