2013-06-28 26 views
1

所以我想知道如果有人知道或有一个普遍的想法如何排序播放列表返回的查询,我保持NEXT_ID和PREVIOUS_ID在同一桌SONG_ID排序MySql查询的两列是上一个和下一个FK的同一个表

表结构:

PLAYLIST_SONG_ID PK, 
PLAYLIST_ID, 
SONG_ID, 
SONG_NAME, 
ARTIST, 
PREVIOUS_PLAYLIST_SONG_ID FK TO PLAYLIST_SONG_ID , 
NEXT_PLAYLIST_SONG_ID FK TO PLAYLIST_SONG_ID 

我认为在把NULL的迹象开始和播放列表的末尾。 另外,如果有人对如何建立表有更好的想法,它也将被赞赏。

感谢

编辑:那么,是否有任何人能提供所需查询的例子吗?

+0

请大家,有人可以提出这个问题的解决方案吗? 我将非常感激! – Bergkamp

回答

0

您可以使用类似PLAYLIST_POSITION列的东西并按该列进行排序。 这应该比下一个/以前更容易处理。只需使用位置+ 1作为下一个和位置 - 1如前。

+0

是的,但是如果您想删除列表中间的歌曲,或者只是通过一个查询更改顺序会怎样? – Bergkamp

+0

这是一个折衷。 ;)你也可以使用'比当前更大的第一个位置'作为下一个。这样,当您在中间删除 – MoYapro

+0

时不需要更改任何内容,因为它不仅仅是大于,我希望能够在同一列表中更改现有记录位置。 – Bergkamp

0

NULL可以工作,但它有点潜在的错误,因为很可能NULL条目可能会因为不需要的原因而在您的最终表中结束,然后这会被解释为播放列表结束,这可能不是您想要的因为它可能会让一个bug更难以发现。我会亲自使用-1而不是NULL来表示我的播放列表开始和停止的位置。我在这里假设你的id值和整数,这样就可以工作。

原因-1是首选,因为您必须每次明确设置您的播放列表开始和停止到-1。您可以放心,对于某些类型的错误,在选定的行中随机放置-1会比NULL更难。此外,mysql中的int类型始终始于1(默认情况下,它不会阻止您执行奇怪的事情),因此负数不会是构成您表的任何id值。这意味着你不必担心-1作为一个ID,你可以放心地确定它始终是播放列表的开始或结束。

编辑:但是要真正解决你的问题,一种方法是包括另一张表,你可以加入你的歌曲表。这个额外的表格将顺序映射到播放列表的歌曲,因此它是多对多连接表。它可以有以下表格结构。

CREATE TABLE IF NOT EXISTS `songs_orders` (
    id int NOT NULL AUTO_INCREMENT, 
    song_id int, 
    order_id int, 
    PRIMARY KEY(id) 
); 
+0

我同意使用-1或任何其他选项的事情比只使用NULL更好。我会用这个想法。 但是,这仍然不能回答我的问题。我想要帮助我建立查询来选择完美排序的列表。 无论如何谢谢 – Bergkamp

+0

好的,我知道这个技巧,一秒钟。 – usumoio

+0

打电话给我坚果,但我不知道如何做到这一点...... 可以说我有两个相关的表:tbl_songs和tbl_playlists。 tbl_playlist拥有playlist_id,song_id和prev,next。 如果我想在列表中间添加歌曲,这将如何帮助我?我需要知道如何改变中间的地方。 – Bergkamp

相关问题