我目前有一张桌子,用于存储商店中音乐销售的排名:
|-date-------|-rank_1---|-rank_2---|-...
| 2015-06-30 | 112 | 145 | ...
| 2015-07-31 | 145 | 147 | ...
| ...
| ...
rank _#列中的每个数字都是引用单独表格中相册的外键:
|-album_id---|-album_name----|-...
| 112 | An Album | ...
| 145 | Another Album | ...
| ...
我想实现一个功能,我可以搜索相册并查看其在各个日期的排名。但是, album_id 可以显示在任何 rank _#列中,我想知道是否有任何方式可以"反转& #34;表格,所以我得到一个结果:
SELECT * FROM table WHERE ....
=> |-date-------|-column-----|
| 2015-06-30 | rank_2 |
| 2015-07-31 | rank_1 |
| ...
现在,我能想到的蛮力方法只是遍历表并查看表中的每个单元格,但看看表格是如何相当大的,我想知道是否有更有效的方法这样做。
答案 0 :(得分:0)
感谢大家的帮助!看起来我正在错误地构造表,而应该像以下那样设置表:
|-date-------|-album_id-|-rank--|
| 2015-06-30 | 112 | 1 |
| 2015-07-31 | 145 | 2 |
| ...
| ...
答案 1 :(得分:0)
沃尔夫冈,这是我的方法:
相册表:
album_id;album_name
1;ska
2;psychobilly
3;punk
4;nu-metal
排名表:
id;date;rank_1;rank_2
1;2016-08-01;1;2
2;2016-08-02;2;1
4;2016-08-03;2;4
建议的查询:
select r.date,a.album_id,a.album_name,r.rank_1,r.rank_2,
case
when a.album_id= r.rank_1 then "rank_1"
when a.album_id= r.rank_2 then "rank_2"
end as "rank"
from albums a
inner join rankings r on (r.rank_1=a.album_id or r.rank_2=a.album_id)
where a.album_name like '%psychobilly%'
<强> 结果: 强>
date;album_id;album_name;rank_1;rank_2;rank
2016-08-01;2;psychobilly;1;2;rank_2
2016-08-02;2;psychobilly;2;1;rank_1
2016-08-03;2;psychobilly;2;4;rank_1
<强> 说明: 强>
查询的最后一列将包含排名中的位置,根据相册ID的值,在&#34; rank_1&#34;之间。和&#34; rank_2&#34;列。
随意试试,这可能对你有帮助......