MySQL按列排序,然后拉出其余部分

时间:2016-08-03 14:52:05

标签: mysql

我有一个独特的情况,我需要提取许多记录,但如果考虑到它们,那么将它们排在最顶层"收藏夹" ...但是我需要拉下面的所有其余记录这个小组。

这可以在一个查询中完成......还是需要两个?有什么例子吗?

1 个答案:

答案 0 :(得分: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 |
+-----+------+----------+--------+