【问题标题】:How can I get the result from mysql after group and order分组和订购后如何从mysql获取结果
【发布时间】:2021-12-28 15:53:33
【问题描述】:

我有以下表格

t1

id stage
1 1,2,3
2 2,3,4

t2

id t_id stage_id
1 1 2
2 1 1
3 1 3
4 2 2
5 2 4
6 2 3

希望结果可以先按t2.t_id排序,再按t1.stage的值排序

喜欢下面的结果

t_id stage_id
1 1
1 2
1 3
2 2
2 3
2 4

我有下面的sql,但是它不起作用。那我该怎么办?

SELECT
    t2.t_id,
    t2.stage_id
FROM
    t2
LEFT JOIN t1 ON t1.id = t2.t_id
GROUP BY
    t2.t_id,
    t2.stage_id
ORDER BY
    t2.t_id,
    field(t2.stage_id, t1.stage)

【问题讨论】:

  • FIELD() 要求每个值都是单独的参数,而不是单个逗号分隔的字符串。
  • 使用FIND_IN_SET() 而不是FIELD()
  • 如果不做任何聚合,为什么还要使用 GROUP BY?为什么不简单地ORDER BY t2.t_id, t2.stage_id

标签: mysql


【解决方案1】:

FIELD() 要求排序依据的每个值都是单独的参数。

FIND_IN_SET() 以逗号分隔的字符串返回索引。

SELECT
    t2.t_id,
    t2.stage_id
FROM
    t2
LEFT JOIN t1 ON t1.id = t2.t_id
GROUP BY
    t2.t_id,
    t2.stage_id
ORDER BY
    t2.t_id,
    find_in_set(t2.stage_id, t1.stage)

请注意,这只会更正 SQL 中的排序标准。这不一定会按该顺序返回每个组中的第一行(如果启用了ONLY_FULL_GROUP_BY SQL 模式,则会出现错误)。请参阅SQL Selecting from two Tables with inner join and limit 了解正确的做法。

【讨论】:

  • 你知道这会产生一个错误因为t1.stagedbfiddle.uk/…
  • @ErgestBasha 谢谢。我对此添加了一个警告。
猜你喜欢
  • 1970-01-01
  • 2018-11-03
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
相关资源
最近更新 更多