php – mysql group by table b,inner join table a for random

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – mysql group by table b,inner join table a for random脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我的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万条记录)上,所以我建议先看一下类似于这类@L_406_16@的东西: 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)

脚本宝典总结

以上是脚本宝典为你收集整理的php – mysql group by table b,inner join table a for random全部内容,希望文章能够帮你解决php – mysql group by table b,inner join table a for random所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。