Php 大型mysql数据库上的Order by rand()
由于这个mysql查询,我的站点的速度非常慢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
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