Php mysql分组按表b,内部联接表a为随机
这是我的两个表,一个内部连接事件的id。我想做这件事: 在表b中,有Php mysql分组按表b,内部联接表a为随机,php,mysql,random,inner-join,Php,Mysql,Random,Inner Join,这是我的两个表,一个内部连接事件的id。我想做这件事: 在表b中,有10张专辑,我想随机拿出4张专辑。然后每个相册选择一条记录,记录在相册中的随机位置 因此,我将取回4条记录(这4条记录没有重复id),然后将这4条记录用于内部联接查询,以从表a中获取标题 这里只有一些记录,仅供测试。事实上,我在表a中有300000条记录,在表b中有2000000条记录 表a +-----+-------+ | id | title | +-----+-------+ | 1 | a1 | +---
10张专辑
,我想随机拿出4张专辑
。然后每个相册
选择一条记录
,记录在相册中的随机位置
因此,我将取回4条记录(这4条记录没有重复id)
,然后将这4条记录用于内部联接查询,以从表a
中获取标题
这里只有一些记录,仅供测试。事实上,我在表a中有300000条记录,在表b中有2000000条记录
表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是否重复?)
我需要一个简单和快速的方法,最好是只使用一个查询。非常感谢 因为我既不是MySQL专家,也不是PHP专家,所以我将尝试使用伪代码和通用SQL。为了便于阅读,我已将您的表格重命名为相册
和曲目
首先将四条随机记录提取到PHP应用程序:
select id from albums order by random() limit 4
其次,迭代四个ID的结果集并获取相应的轨迹(伪php):
我不清楚你是如何将你的曲目与他们的专辑相匹配的。您应该将类似于tracks.album\u id
的内容作为albums.id
的外键,这就是我设计查询的方式。您应该根据需要进行调整,我的解决方案背后的基本逻辑应该保持不变。AFAIR,“ORDER BY RAND()”是非常慢的解决方案,尤其是在您拥有(200多万条记录)这样的表上,因此我建议先看类似于这类文章的内容:
因此,在运行查询之前,您应该知道表中的记录数,然后执行以下操作:
"SELECT * FROM `album` LIMIT 1 OFFSET " . rand(0,$count)
"SELECT * FROM `album` INNER JOIN `tracks`ON `tracks`.`album_id` = `albums`.`id` LIMIT 1 OFFSET " . rand(0,$count)
我相信这将更有效地返回1个随机行
另外,我认为在tracks表中将唱片集引用存储为字符串不是一个好主意,您最好使用一个适当的整数外键album_id引用albums.id。然后,您可以将这两个表连接得更紧密。如果我是你,我会先做:
ALTER TABLE `tracks` add column `album_id` int;
UPDATE `tracks` SET `album_id` = SUBSTRING(`album`,5);
然后,在完成此操作并与上面的解决方案结合后,启动如下操作:
"SELECT * FROM `album` LIMIT 1 OFFSET " . rand(0,$count)
"SELECT * FROM `album` INNER JOIN `tracks`ON `tracks`.`album_id` = `albums`.`id` LIMIT 1 OFFSET " . rand(0,$count)
如果我读对了,你想从你的专辑列表中随机挑选10张专辑,然后从这10张专辑中随机挑选一首曲目?换言之,你想随机选择4首曲目(这反过来也允许你选择专辑),但没有两首曲目可以属于同一张专辑?@Marc B,是的,每个曲目都没有重复的id。@Salman A,是的,没有两首曲目可以属于同一张专辑。我会通过类似封面详细介绍的方式查询随机专辑的a.title
。如果曲目不能属于同一张专辑,恐怕没有比使用光标在这4张随机专辑上迭代,并对每一张专辑执行单独的随机曲目选择查询更简单的方法了。