我有一个字段: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 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表。