我有这两张桌子
CREATE TABLE `users` (
`id` bigint NOT NULL AUTO_INCREMENT,
`status` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=330031656 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ;
CREATE TABLE `user_meta` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL,
`meta_id` bigint NOT NULL,
`value` bigint NOT NULL,
PRIMARY KEY (`id`),
KEY `usermeta_user_id_meta_type_meta_value` (`user_id`,`meta_id`,`value`),
CONSTRAINT `user_meta_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16728 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ;
客户要求,他们希望根据value
,对特定的进行排序meta_id
。例如,假设有 10meta_id
个,客户选择meta_id=1111
。在这种情况下,所有已关联的用户meta_id=1111
都应按其第一顺序排序value
,而其他没有关联的用户meta_id=1111
可以按任何顺序排在底部。
曾经有人问过类似的问题,我也试图根据他们的答案提出疑问,但对我来说似乎不起作用。
这个答案和这个也讨论了使用if-else
和case-when-then
语句,但是当我尝试其中任何一个时
select u.id, um.meta_id, um.value from users u
inner join user_meta um on um.user_id = u.id
order by if(um.meta_id=1111, value, 1);
select u.id, um.meta_id, um.value from users u
inner join user_meta um on um.user_id = u.id
order by case um.meta_id
when 1111 then value else 1 end;
select u.id, um.meta_id, um.value from users u
inner join user_meta um on um.user_id = u.id
order by case
when um.meta_id = 1111 then value else u.id end;
我明白了
+-----------+---------+------------+
| id | meta_id | value |
+-----------+---------+------------+
| 326480529 | 200 | 1730358000 |
| 326850494 | 1111 | 1730185200 |
| 326785127 | 1111 | 1730271600 |
| 326833934 | 1111 | 1730358000 |
| 326467136 | 1111 | 1730358000 |
| 328079379 | 1111 | 1730793600 |
+-----------+---------+------------+
我希望所有带有 的用户都meta_id=1111
排在最上面,但他们既没有排在最上面,也没有在他们自己内部进行排序。同样,对于desc
顺序,带有 的用户meta_id=1111
应该排在最上面,按降序排列,而其他所有用户都可以排在最下面,例如
+-----------+---------+------------+
| id | meta_id | value |
+-----------+---------+------------+
| 328079379 | 1111 | 1730793600 |
| 326833934 | 1111 | 1730358000 |
| 326467136 | 1111 | 1730358000 |
| 326785127 | 1111 | 1730271600 |
| 326850494 | 1111 | 1730185200 |
| 326480529 | 200 | 1730358000 |
+-----------+---------+------------+
非常感谢任何帮助或指导,以解决此问题。非常感谢!
我还发布了INSERT
两个表的一些语句,以便更轻松地在本地机器上复制
INSERT INTO `users` (`id`,`status`) VALUES (328079379,'active');
INSERT INTO `users` (`id`,`status`) VALUES (326833934,'active');
INSERT INTO `users` (`id`,`status`) VALUES (326467136,'deleted');
INSERT INTO `users` (`id`,`status`) VALUES (326785127,'inactive');
INSERT INTO `users` (`id`,`status`) VALUES (326850494,'removed');
INSERT INTO `users` (`id`,`status`) VALUES (326480529,'active');
INSERT INTO `user_meta` (`id`,`user_id`,`meta_id`,`value`) VALUES (13155,328079379,1111,1730793600);
INSERT INTO `user_meta` (`id`,`user_id`,`meta_id`,`value`) VALUES (13045,326833934,1111,1730358000);
INSERT INTO `user_meta` (`id`,`user_id`,`meta_id`,`value`) VALUES (13009,326467136,1111,1730358000);
INSERT INTO `user_meta` (`id`,`user_id`,`meta_id`,`value`) VALUES (13010,326785127,1111,1730271600);
INSERT INTO `user_meta` (`id`,`user_id`,`meta_id`,`value`) VALUES (13051,326850494,1111,1730185200);
INSERT INTO `user_meta` (`id`,`user_id`,`meta_id`,`value`) VALUES (13008,326480529,200,1730358000);
为了达到所需的顺序,需要首先根据 meta_id=1111 的用户的值进行优先排序。
尝试,
查看示例