Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.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数据库上的Order by rand()_Php_Mysql_Performance_Random - Fatal编程技术网

Php 大型mysql数据库上的Order by rand()

Php 大型mysql数据库上的Order by rand(),php,mysql,performance,random,Php,Mysql,Performance,Random,由于这个mysql查询,我的站点的速度非常慢 SELECT content.*, (SELECT content_views.views FROM content_views WHERE content_views.content = content.record_num) as views , (SELECT images.filename FROM images WHERE images.record_num = content.thumbnail) AS thu

由于这个mysql查询,我的站点的速度非常慢

SELECT content.*,
       (SELECT content_views.views FROM content_views WHERE content_views.content = content.record_num) as views ,
       (SELECT images.filename FROM images WHERE images.record_num = content.thumbnail) AS thumbfile
FROM content WHERE enabled = 1  $filterAnd
ORDER BY RAND()
LIMIT $from,$max_results
我知道最好的方法就是这样使用它:

SELECT name
  FROM random AS r1 JOIN
       (SELECT CEIL(RAND() *
                     (SELECT MAX(id)
                        FROM random)) AS id)
        AS r2
 WHERE r1.id >= r2.id
 ORDER BY r1.id ASC
 LIMIT 1
但是我正在使用多个mysql表,我不知道如何像这样使用我的查询,有人能帮我吗

多谢各位

编辑:

我试过:

SELECT content.*,
       (SELECT content_views.views FROM content_views WHERE content_views.content = content.record_num) as views ,
       (SELECT images.filename FROM images WHERE images.record_num = content.thumbnail) AS thumbfile
FROM content AS r1 JOIN
     (SELECT (RAND() * (SELECT MAX(record_num) FROM content)) AS id) AS r2
WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 1

但现在我得到了错误:未知表“content”

此代码从content表中随机选择一行

现在,您需要将此查询视为一个名为randomTable字段的表,就像在content table中一样。现在你可以从中选择,加入它,做你需要的一切。注意$filter,我用了两次。仅当$filter包含与内容表相关的条件时,此选项才起作用。

您已为表内容指定了名为r1的别名。然后,您需要使用该别名来引用该特定表:

SELECT r1.*,
       (SELECT cv.views
        FROM content_views cv
        WHERE cv.content = r1.record_num
       ) as views,
       (SELECT i.filename
        FROM images i
        WHERE i.record_num = r1.thumbnail
       ) AS thumbfile
FROM content r1 JOIN
     (SELECT RAND() * (SELECT MAX(record_num) FROM content) AS id
     ) r2
WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 1

此版本中的许多表都有表别名。

到目前为止,大多数建议都采用无孔的自动增量id。如果这不适用,请参阅该解决方案,再加上7个

SELECT r1.*,
       (SELECT cv.views
        FROM content_views cv
        WHERE cv.content = r1.record_num
       ) as views,
       (SELECT i.filename
        FROM images i
        WHERE i.record_num = r1.thumbnail
       ) AS thumbfile
FROM content r1 JOIN
     (SELECT RAND() * (SELECT MAX(record_num) FROM content) AS id
     ) r2
WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 1