对数组中的某一字段进行排序时,mysql查询[重复]。

问题描述 投票:0回答:1

我有一个字段:userids,其中包含19,2,23,我根据任意添加到一个房间的用户id来填充。 我根据这些用户id列出相应的名字。

现在我从这个查询中得到Richard, Evan, James (19 = Richard, 2 = Evan, 23 = James)。

我想做的是在查询时对数组(字段)进行排序,使其为2,19,23,并返回Evan, Richard, James。

所以,一个看起来像这样的查询。

    SELECT c.*,c.NAME as PAGE, ASORT(c.USERIDS) as USERIDS, p.* 
    FROM TBL_CONTENT c, TBL_PAGE p 
    WHERE c.PAGEID = p.ID AND FIND_IN_SET(?, c.USERIDS) 

应该是这样的(帮我完成这个查询)?

当然,ASORT函数并不存在--我只是把它作为一个例子来说明我想做的事情。

有什么可以帮助我的吗?

mysql arrays sorting
1个回答
0
投票

这与mysql 8一起工作

对于mysql 5.x,你需要更多的代码来实现这一点

SET @a = '19,2,23';

SELECT GROUP_CONCAT(ord ORDER BY ord) 
FROM
(select  CAST(num as UNSIGNED) ord
from (SELECT @a as names) t
join json_table(
  replace(json_array(t.names), ',', '","'),
  '$[*]' columns (num varchar(50) path '$')
) j) z1

结果

# GROUP_CONCAT(ord ORDER BY ord)
2,19,23

对于Mysql 5.x,你可以使用函数

DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `fn_split_stringnumbers_and_sort`(_text TEXT) RETURNS text CHARSET utf8mb4
    DETERMINISTIC
BEGIN
SET @text = _text;
SELECT 
GROUP_CONCAT((name+0) ORDER BY (name +0)) INTO @output
FROM
(
select
  SUBSTRING_INDEX(SUBSTRING_INDEX(t1.name, ',', numbers.n), ',', -1) name
from
  (select 1 n union all
   select 2 union all select 3 union all
   select 4 union all select 5) numbers INNER JOIN (SELECT @text as name) t1
  on CHAR_LENGTH(t1.name)
     -CHAR_LENGTH(REPLACE(t1.name, ',', ''))>=numbers.n-1
order by  n
) t2;

RETURN @output;
END$$
DELIMITER ;

所以,这个查询

SET @a = '19,2,23';
SELECT fn_split_stringnumbers_and_sort(@a);

有同样的结果

# fn_split_stringnumbers_and_sort(@a)
2,19,23

注意事项 这个函数只能拆分5个逗号分隔的数字,如果你有更多的数字,你必须增加更多的UNION表。

© www.soinside.com 2019 - 2024. All rights reserved.