MySQL:如何查找可能存在于多个列中的值

时间:2016-08-03 18:42:54

标签: mysql sql database

我目前有一张桌子,用于存储商店中音乐销售的排名:

|-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     |
   | ...

现在,我能想到的蛮力方法只是遍历表并查看表中的每个单元格,但看看表格是如何相当大的,我想知道是否有更有效的方法这样做。

2 个答案:

答案 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;列。

随意试试,这可能对你有帮助......