【问题标题】:Mysql select combinationmysql选择组合
【发布时间】:2017-04-19 08:05:31
【问题描述】:

你好,我有一张大桌子,里面有很多这样的行。

ID / NAME    / CNT
6  / yassine / 2
5  / yassine / 9
4  / yassine / 10
3  / yassine / 12
2  / yassine / 8
1  / yassine / 3

我想要的是按 desc 选择前 4 个 ID 顺序,它们是 6/5/4/3,然后在它们显示顺序之后,第一个 两个 按 id 显示,其余按 cnt 显示,所以输出是这样的:6/5/3/4。 我试过的是

(select * from table order by id desc limit 2) union (select * from (select * from table order by id desc limit 4) order by cnt desc)

但它似乎不起作用。任何人都可以帮忙吗? 更新 1:输出

 ID / NAME    / CNT
    6  / yassine / 2
    5  / yassine / 9
    3  / yassine / 12
    4  / yassine / 10

【问题讨论】:

  • 没有明确的方法可以像这样对数据进行排序。你想达到什么目的?
  • @TimBiegeleisen 请检查更新我刚刚添加了想要的输出
  • IDCNT 列均未在您的输出中排序。你能提供你是如何得出这样一个结果的逻辑吗?
  • 我也无法解释您在 cnt 上的排序! 9 小于 10 或 12。除非您想将它们作为字符串排序...
  • @TimBiegeleisen 我想要的是按 id 排序前 2 个元素,所以我有 6 5,其余按 CNT 所以我有 3 然后 4 最终输出是 6 5 3 4

标签: mysql sql


【解决方案1】:

使用union 组合一个查询,该查询根据 id 选择前 2 条记录并将计算字段添加为 1,另一个查询通过 id 添加计算字段 0 提取 3-4 条记录。添加总订单按子句使用条件语句根据计算字段的值进行排序。

(select id, cnt, 1 as srt from yourtable order by id desc limit 2)
union
(select id, cnt, 0 as srt from yourtable order by id desc limit 2, 2)
order by srt desc, if(srt=1, id, cnt) desc

【讨论】:

  • 您的第二个LIMIT 语句有问题。
  • 想解释一下@TimBiegeleisen?
  • 工作得像个沙姆!
  • @TimBiegeleisen 我将限制 2,2 编辑到想要的范围并且它有效!
  • @TimBiegeleisen 问题说需要按 id 排序前 4 条记录。 union 中的第 2 次查询是通过 id 选择第 3 条和第 4 条记录,所以我相信它是正确的。然而,您的第二个查询的限制是不正确的,因为它会提取所有记录,而不仅仅是第三个和第四个。 OP 接受查询就是证明。
【解决方案2】:

我认为你应该使用子查询来做到这一点:

select t.*
from (select t.*, (@rn := @rn + 1) as rn
      from t cross join 
           (select @rn := 0) params
      order by id desc
      limit 4
     ) t
order by (case when rn <= 2 then id 1 else 2 end),
         (case when rn <= 2 then id end),
         cnt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-21
    • 2016-02-21
    • 1970-01-01
    • 2019-09-18
    • 2010-10-21
    • 1970-01-01
    • 2017-09-27
    • 2018-07-17
    相关资源
    最近更新 更多