2015-08-21 41 views
1

我被困在那里我有一定的id,我需要先建立索引的结果,以便他们安排(一个问题,不按字母顺序设置后,这些应该索引这些ID在数组中)和其他记录按字母顺序提取,但在其后显示。提取记录中提供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获取的结果,但它也不能工作。

请帮忙。

以下是我的表结构:除了对于所提到的IDS

`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`) 

,我想通过自己的FNAME和LNAME排序记录休息,如果他们不为空。

我还应该提到,括号中的ID是从另一个表中提取的。

我想我也应该提到,我想聪明的用户获取他们的级别。用户排名计算并记录在Mongo数据库的单独表中。 “用户”表保留MySql中所有用户的记录。 很难描述排名的表结构。但是我们从排名表中获取user_id和rank字段。

我获取用户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

请提供表格的结构。你试图分类的其他领域是什么? – rlanvin

+0

你试过这个:http://stackoverflow.com/questions/6332043/sql-order-by-multiple-values-in-specific-order – Ali

+0

@Ali我链接你提及对我没有用,因为括号中的值我提到的不是静态的,随着时间的推移会随着用户的等级变化而随着时间的增长而不断变化。 –

回答

0

此,我想,应该做的伎俩:如果你需要在你把那么在随后的相同顺序指定ID的

SELECT * 
FROM `users` `t` 
ORDER BY field(`t`.`id` , 3694181860160, 3690073978560, 3692021760768, 3696518283776, 3694455712256, 3698627050368, 3694698638592, 3696980086784, 3693461701760) DESC, `t`.`id` ASC; 

,你将不得不选择每一个单独和联合组合的结果。

+0

我以这种方式获取记录。由于空间不足导致结果短缺。此方法不起作用。[“3696980086784”,“3694698638592”,“3698627050368”,“3694455712256”,“3696518283776”,“3692021760768”,“3694181860160”,“3699651556928”,“3692701454400”,“3698600774656”,“3694185651456 ”, “3693845934656”, “3693594951616”, “3691028107200”, “3691373773376”, “3697095829184”, “3690766807168”, “3692501641984”, “3698855465792”, “3699391648768”, “3697583058176”, “3696726122496”, “3693843354368”, “3693046966528”, “3697718637760”, “3691835711424”, “3698454857408”, “3692364783936”, “3696155633984”, “3697502467584”]'。 –

0

也许你需要重新考虑你正在试图用你的查询做什么。保证返回记录顺序的唯一方法是使用和order-by子句,但看起来你没有一个字段可以在你的表中订购。根据我的理解,你需要对返回的值进行任意排序,这些排序靠近查询被触发并且不能预先知道(即运行时)的时间。

所以,你有两个选择:

  • 通过订单字段中添加数字表,字段的设定值,以适应所要返回数据的准确顺序,然后立即通过查询表和订单顺序字段。
  • 查询数据,然后自己订购记录(数据库外部),将每个项目准确地放在列表中您想要的位置。
0

您应该有两个级别ORDER BY。首先,按照您的首选值排序,然后按其他方式排序。 9999只是价值只有在首选那些将高到足以确保非首选号码将出现:

SELECT * FROM users t 
ORDER BY if(@x:=FIND_IN_SET(t.id,'3694181860160, 3690073978560, 3692021760768, 3696518283776, 3694455712256, 3698627050368, 3694698638592, 3696980086784, 3693461701760'),@x,9999), fname, lname; 

您也可以重写这个,这样你就不需要临时变量:

SELECT * FROM users t 
ORDER BY 
IF(
    t.id IN (3694181860160, 3690073978560, 3692021760768, 3696518283776, 3694455712256, 3698627050368, 3694698638592, 3696980086784, 3693461701760), 
    FIND_IN_SET(t.id,'3694181860160, 3690073978560, 3692021760768, 3696518283776, 3694455712256, 3698627050368, 3694698638592, 3696980086784, 3693461701760'), 
    9999), 
fname, lname; 

在这种情况下,您需要提供两次优先ID列表。