Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql分组按表b,内部联接表a为随机_Php_Mysql_Random_Inner Join - Fatal编程技术网

Php mysql分组按表b,内部联接表a为随机

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 | +---

这是我的两个表,一个内部连接事件的id。我想做这件事:

在表b中,有
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张随机专辑上迭代,并对每一张专辑执行单独的随机曲目选择查询更简单的方法了。