2011-05-10 63 views
3

我正在寻找一个正确的mysql查询我的网站http://watiseropderadio.nl(在荷兰)。这是一个网站,了解荷兰流行电台播放的歌曲。获取N行的组/线程/主题

我想做一个查询什么返回13行为每个radiostation。有8种不同的放射治疗。

这是我的表:

id  | radioname  | time | artist | song 
-------------------------------------------------------------- 
23421 | radio 538  | 19:34 | Queen  | Bohemian 
23422 | radio veronica | 19:35 | Rammstein | Blablabla 
23423 | slam fm   | 19:34 | Roxette | Blablabla 
23424 | 3fm    | 19:34 | Blabla | Blablabla 
.... 

这是一个与3,000,000+记录,并与这些关键的一个表:

PRIMARY    PRIMARY 3083007 id 
radioname   INDEX 8   radioname 
track with artist INDEX 23715  artist 
             song 

这是我想成为的输出:

id  | radioname  | time | artist | song 
-------------------------------------------------------------- 
23455 | radio 538  | 19:30 | Blabla | Blablabla 
23470 | radio 538  | 19:33 | Blabla | Blablabla 
23484 | radio 538  | 19:36 | Blabla | Blablabla 
23498 | radio 538  | 19:38 | Blabla | Blablabla 
total 13 x .... 
23456 | radio veronica | 19:29 | Blabla | Blablabla 
23476 | radio veronica | 19:32 | Blabla | Blablabla 
23483 | radio veronica | 19:36 | Blabla | Blablabla 
23495 | radio veronica | 19:39 | Blabla | Blablabla 
total 13 x .... 

结果的顺序无关紧要,查询必须快速。我喜欢亲自尝试一下,但这对我来说有一点意义。

我不知道密钥是否适合这份工作,有人可以提供一些建议吗?

+1

除了你的问题:我会使用一个数字ID为广播电台,而不是每次都保存全名。 – abaumg 2011-05-10 16:00:37

+0

@abaumg我打算这么做,谢谢。它会节省很多时间吗?由于加载最近2小时记录的时间为3(!)秒。 – harianus 2011-05-10 16:43:08

+0

我不是MySQL大师,不知道它会节省多少时间,但它会节省一些时间。这是很好的数据库设计。 – abaumg 2011-05-10 17:12:55

回答

1

这很棘手,因为虽然有很多方法可以说“让我只有13条记录用于这个查询”,但据我所知,没有办法直接说“只给我13条记录, X”。

我能想到的唯一方法就是在记录中添加一个“play number”字段,或者如果您不能或不想更改“歌曲播放“的纪录。然后,当记录添加到表格中时,为该广播电台分配下一个可用号码。 (实际上MySQL有一个功能可以自动执行此操作)。然后,您的查询可以查找此索引< = 13,或者如果可以删除记录,则可以使用内部查询来执行“select station,max(play)站”,再查询外层可以选择 “在那里玩> maxplay-13”

更新

要设置MySQL自动递增,见http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html。特别注意围绕句子的讨论,“对于MyISAM和BDB表,您可以在多列索引的辅助列上指定AUTO_INCREMENT,在这种情况下,AUTO_INCREMENT列的生成值计算为MAX(auto_increment_column)+ 1 WHERE prefix = given-prefix。当你想将数据放入有序组时,这很有用。“ (坦白地说,这是一段时间,因为我用这个,所以我不能提供很多细节。)

+0

听起来很清楚。你可以链接说明这个功能吗(其实MySQL有一个自动做这个的功能)? – harianus 2011-05-10 16:36:44

+0

或者仅仅通过'UPDATE table SET lastplay = lastplay - 1 WHERE radioname ='radio 538'AND lastplay> 0'? – harianus 2011-05-10 16:48:58

+0

@harianus:查看更新。如果我使用MySQL以外的数据库,但在前缀中没有这样的“自动编号”功能,我想我可能会编写代码来分配序列号,或者在插入每条记录时分配它们。 “插入到播放列表中(...无论...,playnumber)值(...无论...,(从播放列表中选择合并(max(playnumber),0)+1其中radioname = <新radioname>))” – Jay 2011-05-11 21:14:57

0

循环播放无线电台列表(因为只有8个)和发射8个独立疑问?喜欢的东西

<?php 
$stations = array('radio 538', 'radio veronica', 'slam fm', '3fm'); 
foreach ($stations as $station) 
{ 
    $query = sprintf('SELECT * FROM table WHERE radioname="%s" ORDER BY time ASC LIMIT 0,13', $station); 
    // do something 
} 
?> 

[未经测试!]

+0

这是可以接受的,但我希望有一个MySQL解决方案。但是现在我知道没有,这将会起到诀窍的作用。 – harianus 2011-05-10 19:34:53