Eu tenho essas 2 mesas
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 ;
O requisito do cliente é que ele queira classificar com base em value
, para um meta_id
. Por exemplo, digamos que há 10 meta_id
s, e o cliente seleciona meta_id=1111
. Nesse caso, todos os usuários que se meta_id=1111
associaram devem ser classificados pelo value
primeiro, e os outros usuários que não se associaram meta_id=1111
podem vir em qualquer ordem na parte inferior.
Perguntas semelhantes foram feitas e tentei formular perguntas com base nas respostas, mas elas não parecem funcionar para mim.
Esta resposta e esta também falam sobre o uso de instruções if-else
and case-when-then
, mas quando tento qualquer uma delas
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;
Eu entendo isso
+-----------+---------+------------+
| id | meta_id | value |
+-----------+---------+------------+
| 326480529 | 200 | 1730358000 |
| 326850494 | 1111 | 1730185200 |
| 326785127 | 1111 | 1730271600 |
| 326833934 | 1111 | 1730358000 |
| 326467136 | 1111 | 1730358000 |
| 328079379 | 1111 | 1730793600 |
+-----------+---------+------------+
Quero que todos os usuários com meta_id=1111
venham no topo, mas eles não vêm no topo, nem são classificados dentro de si mesmos. Da mesma forma, para desc
ordem, os com meta_id=1111
devem vir no topo, classificados em ordem decrescente, e todos os outros podem vir na parte inferior, como este
+-----------+---------+------------+
| id | meta_id | value |
+-----------+---------+------------+
| 328079379 | 1111 | 1730793600 |
| 326833934 | 1111 | 1730358000 |
| 326467136 | 1111 | 1730358000 |
| 326785127 | 1111 | 1730271600 |
| 326850494 | 1111 | 1730185200 |
| 326480529 | 200 | 1730358000 |
+-----------+---------+------------+
Eu realmente apreciaria qualquer ajuda ou direção para fazer isso direito. Muito obrigado!
Também estou postando algumas INSERT
instruções para ambas as tabelas para facilitar a replicação em suas máquinas locais
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);
Para atingir a ordem desejada, os usuários com meta_id=1111 precisam ser priorizados, classificando-os com base em seu valor primeiro.
Tentar,
Veja o exemplo