php – mysql group by table b,inner join table a for random
发布时间:2020-12-13 16:16:11 所属栏目:PHP教程 来源:网络整理
导读:这是我的2个表,内部联接事件的id.我想做这件事: 在表b中,有10张专辑,我想随机拿出4张专辑.然后每张专辑选择一张唱片,该唱片是专辑中的随机位置. 这样我将得到4条记录(这4条记录没有重复的id),然后将这4条记录作为内部联接查询,从表a中获取标题. 这里只有很
这是我的2个表,内部联接事件的id.我想做这件事:
在表b中,有10张专辑,我想随机拿出4张专辑.然后每张专辑选择一张唱片,该唱片是专辑中的随机位置. 这样我将得到4条记录(这4条记录没有重复的id),然后将这4条记录作为内部联接查询,从表a中获取标题. 这里只有很少的记录供测试.事实上,表a中有300,000条记录,表b中有2,000,000条记录. 表a +-----+-------+ | id | title | +-----+-------+ | 1 | a1 | +-----+-------+ | 2 | a2 | +-----+-------+ | 3 | a3 | +-----+-------+ | 4 | a4 | +-----+-------+ | 5 | a5 | +-----+-------+ | 6 | a6 | +-----+-------+ 表b +-----+--------+ | id | album | +-----+--------+ | 1 | album1 | +-----+--------+ | 2 | album1 | +-----+--------+ | 3 | album1 | +-----+--------+ | 6 | album1 | +-----+--------+ | 2 | album2 | +-----+--------+ | 3 | album2 | +-----+--------+ | 5 | album3 | +-----+--------+ | 6 | album3 | +-----+--------+ | 3 | album4 | +-----+--------+ | 2 | album5 | +-----+--------+ | 4 | album5 | +-----+--------+ | 5 | album5 | +-----+--------+ | 1 | album6 | +-----+--------+ | 3 | album6 | +-----+--------+ | 2 | album7 | +-----+--------+ | 4 | album7 | +-----+--------+ | 1 | album8 | +-----+--------+ | 5 | album8 | +-----+--------+ | 3 | album9 | +-----+--------+ | 2 | album10| +-----+--------+ | 5 | album10| +-----+--------+ 我不擅长mysql查询.在我看来,我会这样做 select * from b group by album order by random() limit 0,4 拿回4张专辑,然后做一个内连接查询(此查询不正确,如何检查b.id没有重复?) select * from b inner join a on b.id = a.id where (select id from b where b.album = '".$row['album']."' order by random() limit 1) 我需要一个简单快捷的方法,最好只使用一个查询.非常感谢. 解决方法
AFAIR,“ORDER BY RAND()”是一个非常缓慢的解决方案,特别是在像你这样的表(200万条记录)上,所以我建议先看一下类似于这类文章的东西:
http://www.greggdev.com/web/articles.php?id=6
因此,在运行查询之前,您应该知道表中的记录数,然后执行以下操作: "SELECT * FROM `album` LIMIT 1 OFFSET " . rand(0,$count) 我相信,这将更有效地返回1个随机行. 另外,我认为将专辑引用存储为轨道表中的字符串并不是一个好主意,您宁可使用引用于专辑的id的正确整数外键album_id.然后你可以加入两个表更胖.如果我是你,我会先做: ALTER TABLE `tracks` add column `album_id` int; UPDATE `tracks` SET `album_id` = SUBSTRING(`album`,5); 然后,在完成此操作并结合上述解决方案后,启动以下内容: "SELECT * FROM `album` INNER JOIN `tracks`ON `tracks`.`album_id` = `albums`.`id` LIMIT 1 OFFSET " . rand(0,$count) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |