按提供的ID顺序获取记录,未提供的ID应按字母顺序索引

时间:2015-08-21 13:11:19

标签: mysql

我遇到了一个问题,我有一些我需要在结果中首先编入索引的ID,以便按顺序排列(在数组中),其他记录按字母顺序提取但在其后显示。

例如,我的s​​ql查询如下所述:

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

它工作正常,随着时间的推移,这将显示越来越多的用户。

2 个答案:

答案 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子句,但看起来你没有可以在表中订购的字段。根据我的理解,您希望在返回值上有一个任意顺序,该顺序接近于触发查询的时间,并且无法事先知道(即运行时)。

所以你有两个选择:

  • 向表中添加数字order-by字段,设置字段的值以匹配您希望数据返回的确切顺序,然后立即查询表并按order-by字段排序。
  • 查询数据,然后自行订购记录(在数据库外部),将列表中的每个项目准确放置在您想要的位置。