我有两个表,其中一个(让我们称之为‘轨道’)将有音乐轨道信息,如标题,时间,样本文件,价格和所有所需的东西。第二个表(让我们称之为“类别”)将具有从第一个表、类别类型(乐器、体裁、语气等)和类别id到类别id的id。
对于特定的轨道,可以有未知数量的类别。例如,使用id=1的曲目可以有乐器类别3和4,情绪类别1,2,3等等。
我需要得到排序(按标题,时间,价格或任何其他)的轨道,也使用限制(用于分页)过滤的情绪或乐器或任何类型(S)。
有人能帮我像这样组装查询吗?我不知道怎么开始。
下面是表结构的示例:
表“轨迹”
+----+---------+-------+------+
| id | title | Price | Time |
+----+---------+-------+------+
| 1 | Title 1 | 10 | 0 |
| 2 | Title 2 | 9 | 1 |
| 3 | Title 3 | 8 | 2 |
+----+---------+-------+------+表“类别”
+----+------------+-------------+----------+
| id | type | category_id | track_id |
+----+------------+-------------+----------+
| 1 | instrument | 1 | 1 |
| 2 | instrument | 10 | 1 |
| 3 | genre | 1 | 1 |
| 4 | mood | 15 | 2 |
+----+------------+-------------+----------+当然,我会使用int作为类别类型,但我使用单词作为示例。
关于致命缺陷的更新:
juergen d解决方案工作良好,但它有一个致命的缺陷。如果我有所有可能的乐器,类型和情绪在一个单独的下拉,我想过滤出有乐器1,情绪2和类型3的曲目,通过选择下拉框。清单上显示了所有有乐器的曲目或第二乐章或.没有,而且。
有人能帮我修改一下吗?
发布于 2014-06-22 12:31:18
一个更好的DB设计应该是
表“轨迹”
+----+---------+-------+------+
| id | title | Price | Time |
+----+---------+-------+------+
| 1 | Title 1 | 10 | 0 |
| 2 | Title 2 | 9 | 1 |
| 3 | Title 3 | 8 | 2 |
+----+---------+-------+------+表“类别”
+----+------------+
| id | type |
+----+------------+
| 1 | instrument |
| 2 | genre |
| 3 | mood |
+----+------------+表“track_categories”
+-------------+-------------------------+
| category_id | sub_category | track_id |
+-------------+-------------------------+
| 1 | 3 | 1 |
| 1 | 1 | 1 |
| 3 | 1 | 1 |
| 2 | 3 | 2 |
+-------------+-------------------------+然后可以运行查询(例如,对于体裁曲目)
select t.*
from tracks t
join track_categories tc on tc.track_id = t.id
join categories c on c.id = tc.category_id
where c.type = 'genre'如果要选择具有特殊类型组合的曲目,请使用
select t.title
from tracks t
join track_categories tc on tc.track_id = t.id
join categories c on c.id = tc.category_id
group by t.title
having sum(c.type = 'instrument' and tc.sub_category = 1) > 0
and sum(c.type = 'mood' and tc.sub_category = 2) > 0
and sum(c.type = 'genre' and tc.sub_category = 3) > 0https://stackoverflow.com/questions/24351224
复制相似问题