MySQL根据一列降序数取一系列值,然后随机化该范围

时间:2014-03-29 03:57:04

标签: mysql sql

我在代码中实现什么应该是一个简单的查询。我正在尝试获取一系列值,比如在名为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()

我真的希望我不需要连接和伪表,但如果我这样做,那就这样吧。

4 个答案:

答案 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()