我遇到了一个问题,我有一些我需要在结果中首先编入索引的ID,以便按顺序排列(在数组中),其他记录按字母顺序提取但在其后显示。
例如,我的sql查询如下所述:
SELECT *
FROM `users` `t`
ORDER BY field( `t`.`id` , 3694181860160, 3690073978560, 3692021760768, 3696518283776, 3694455712256, 3698627050368, 3694698638592, 3696980086784, 3693461701760 )
它应该首先记录顺序(3694181860160,3690073978560,3692021760768,3696518283776,3694455712256,3698627050368,3694698638592,3696980086784,3693461701760),其余的记录应按字母顺序显示在其后。
目前我从上述列表中获取记录,但是按随机顺序排列,其余记录不确定如何订购。
我还尝试使用
获取结果 order by find_in_set
但它也无效。
请帮忙。
以下是我的表结构:
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`fname` varchar(30) NOT NULL,
`lname` varchar(30) NOT NULL,
`email` varchar(50) NOT NULL,
`password` varchar(100) DEFAULT NULL,
`display_picture` varchar(255) DEFAULT NULL,
`last_login` datetime NOT NULL,
`reg_date` datetime NOT NULL,
`user_type` enum('admin','user') NOT NULL DEFAULT 'user',
`status` enum('0','1') NOT NULL DEFAULT '1',
`email_verified` enum('0','1') NOT NULL DEFAULT '0',
`feed_visibility` enum('public','relation','private') NOT NULL DEFAULT 'relation',
`groups` text NOT NULL,
`contact_allowance` enum('public','private','relation') NOT NULL DEFAULT 'public',
`search_allowance` enum('0','1') NOT NULL DEFAULT '1',
`country` int(11) NOT NULL,
`dob` date NOT NULL,
`gender` enum('male','female') DEFAULT NULL,
`fb_id` varchar(50) NOT NULL,
`state` varchar(255) NOT NULL,
`city` varchar(255) NOT NULL,
`street` varchar(255) NOT NULL,
`is_admin` tinyint(1) NOT NULL DEFAULT '0',
`flame_name` varchar(50) NOT NULL,
`device_id` varchar(100) DEFAULT NULL,
`fav_cat` text,
`credits` int(20) DEFAULT NULL,
`privacy_setting` varchar(255) DEFAULT NULL,
`is_deleted` tinyint(4) NOT NULL DEFAULT '0',
`reason_to_delete_account` varchar(255) NOT NULL,
`verification_hash` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
除了上面提到的ID之外,如果它们不是空的,我希望其余的记录按其fname和lname排序。
我还应该提一下,括号中的Ids是从另一个表中提取的。
我想我还应该提一下,我正在努力提升用户的排名。用户排名计算并记录在Mongo db的单独表中。而用户' table保留MySql中所有用户的记录。 很难描述排名的表格结构。但是我们从排名表中获取user_id和rank字段。
我正在获取用户ID,他们从排名表中排名并尝试从用户表中获取用户信息,以便在所有用户显示其排名方式的页面中显示它们。其中很少有用户没有达到排名,所以他们的ID还没有排名表。我想按照他们的fname,lname(如果他们有fname,lname)的字母顺序对它们进行排序
.........
我确实重新思考过它,只返回那些由排名表提取的记录。因此,当排名表中有更多记录时,页面将显示更多记录。我使用查询
SELECT * FROM `users` `t` where `t`.`id` in (3694181860160, 3690073978560, 3692021760768, 3696518283776, 3694455712256, 3698627050368, 3694698638592, 3696980086784, 3693461701760 )
ORDER BY field( `t`.`id` , 3694181860160, 3690073978560, 3692021760768, 3696518283776, 3694455712256, 3698627050368, 3694698638592, 3696980086784, 3693461701760 ) ASC
它工作正常,随着时间的推移,这将显示越来越多的用户。
答案 0 :(得分:0)
我认为,应该这样做:
SELECT *
FROM `users` `t`
ORDER BY field( `t`.`id` , 3694181860160, 3690073978560, 3692021760768, 3696518283776, 3694455712256, 3698627050368, 3694698638592, 3696980086784, 3693461701760 ) DESC, `t`.`id` ASC;
如果您需要按照相同的顺序输入指定的ID,那么您必须单独选择每个ID并将所有结果合并在一起。
答案 1 :(得分:0)
也许您需要重新考虑您要对查询执行的操作。保证返回记录顺序的唯一方法是使用order-by子句,但看起来你没有可以在表中订购的字段。根据我的理解,您希望在返回值上有一个任意顺序,该顺序接近于触发查询的时间,并且无法事先知道(即运行时)。
所以你有两个选择: