2016-08-03 2 views
-2

У меня есть уникальная ситуация, когда мне нужно вытащить много записей, но сортировать НЕКОТОРЫЕ вверху, если они считаются «фаворитами» ... но тогда мне нужно вытащить все остальное записей ниже этой группы.MySQL Сортировка по столбцу, затем вытягивание остатка

Можно ли это сделать в одном запросе ... или мне нужны два? Любые примеры?

+1

Да, это может быть сделано. что ты уже испробовал? – mituw16

+1

'order by' может иметь произвольные выражения' order by (somefield = 42) DESC, somefield', поместил бы все записи «42» в начале набора результатов, а затем остальные записи впоследствии. –

ответ

0

Вы можете иметь пользовательские Order By с пунктом CASE/WHEN:

Схема:

create table music 
( mId int auto_increment primary key, 
    song varchar(100) not null 
); 

create table person 
( pId int auto_increment primary key, 
    pName varchar(100) not null 
); 

create table person_owns_music 
( id int auto_increment primary key, 
    mId int not null, 
    pId int not null, 
    favorite int not null, 
    rating int not null, -- 100 loves it. 0 hates it 
    foreign key `pom_2_music` (mId) references music(mId), 
    foreign key `pom_2_person` (pId) references person(pId) 
); 
-- truncate table person_owns_music; 
insert music(song) values ('s1'),('s2'),('s3'),('s4'),('s5'),('s6'); 
insert person(pName) values ('p1'),('p2'),('p3'); 
insert person_owns_music(mId,pId,favorite,rating) values 
(1,1,1,10),(2,1,1,100),(3,1,0,65),(4,1,1,15),(6,1,1,5), 
(1,2,1,10),(2,2,1,100),(5,2,1,100); 

Запрос:

SELECT pom.mId,m.song,pom.favorite,pom.rating 
FROM person_owns_music pom 
JOIN music m ON m.mId=pom.mId 
WHERE pom.pId=1 
ORDER BY CASE pom.favorite 
     WHEN 1 THEN 1 
     WHEN 0 THEN 2 
     END, pom.rating DESC; 
+-----+------+----------+--------+ 
| mId | song | favorite | rating | 
+-----+------+----------+--------+ 
| 2 | s2 |  1 | 100 | 
| 4 | s4 |  1 |  15 | 
| 1 | s1 |  1 |  10 | 
| 6 | s6 |  1 |  5 | 
| 3 | s3 |  0 |  65 | 
+-----+------+----------+--------+