我在代码中实现什么应该是一个简单的查询。我正在尝试获取一系列值,比如在名为front_weight的列中按顺序编号1-20,然后按该列随机化该查询。到目前为止,我想出的是:
$sql_rand_limit_range = "SELECT * FROM posts
WHERE active='y'
AND front_weight > 0
AND front_weight
IN (SELECT front_weight
FROM posts ORDER BY front_weight DESC LIMIT 0, 20)
ORDER BY RAND()";
我收到此错误:
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
顺便说一句,我正在运行MySQL 5.1版。然后我尝试用一下这样的问题来尝试这样的东西,在我看来应该有效:
$sql_rand_limit_range = "SELECT * FROM posts
WHERE active='y'
AND front_weight > 0
ORDER BY RAND() front_weight DESC
LIMIT 0, 20";
$sql_rand_limit_range = "SELECT * FROM posts
WHERE active='y'
AND front_weight > 0
ORDER BY front_weight DESC
LIMIT 0, 20
RAND()";
但是你的SQL忍者可以看到这让我有多远。任何想法或我是否必须使用像随机化mysqli_fetch_array这样的Php代码做一些更激烈的事情?
编辑:我收到很多异国情调的查询以返回类似15,12,3,17,9,5,11 ......我只想在随机列中返回1-20行。基本上我试图用sql说法如何得到这个: ORDER BY front_weight DESC LIMIT 0, 20
对此很好玩:
ORDER BY RAND()
我真的希望我不需要连接和伪表,但如果我这样做,那就这样吧。
答案 0 :(得分:1)
谢谢大家的帮助。在继续使用它之后,我找到了满足我需求的正确查询:
$sql_rand_limit_range = "SELECT * FROM posts
WHERE active='y'
AND front_weight BETWEEN 1 AND 20
ORDER BY RAND()";
老好的BETWEEN,很难用,但从未真正忘记!
答案 1 :(得分:0)
试试这个
$sql_rand_limit_range = "SELECT * FROM posts
WHERE active='y'
AND front_weight > 0
AND front_weight
IN (SELECT front_weight
FROM posts ORDER BY front_weight DESC)
ORDER BY RAND LIMIT 0, 20";
答案 2 :(得分:0)
尝试使用INNER JOIN
代替IN
$sql_rand_limit_range = "SELECT p1.* FROM posts p1
INNER JOIN
(SELECT front_weight
FROM posts ORDER BY front_weight DESC LIMIT 0, 20) as p2
ON p1.front_weight = p2.front_weight
WHERE p1.active='y'
AND p1.front_weight > 0
ORDER BY RAND()";
根据您的评论,您想要一个简化版本。然后尝试
$sql_rand_limit_range = "SELECT * FROM posts
WHERE active='y'
AND front_weight BETWEEN 1 AND 20
ORDER BY RAND()";
答案 3 :(得分:0)
你可以试试RIGHT JOIN
SELECT posts.* FROM posts
RIGHT JOIN
(SELECT front_weight FROM posts WHERE active='y' AND front_weight > 0 DESC LIMIT 0,20) randomizer
ON posts.front_weight = randomizer.front_weight
ORDER BY RAND()