【问题标题】:Get some random and some specific records in a single query?在单个查询中获取一些随机记录和一些特定记录?
【发布时间】:2011-06-11 08:15:51
【问题描述】:

所以我有一个封面流样式的图像轮播,由类似的查询填充

SELECT foo FROM `imageTable` ORDER BY RAND() LIMIT 0, 12;

我的客户想要添加一组永久图像。由于使用结果的方式,如果我可以将这些记录作为原始查询的一部分,那将非常方便。

我试过了

SELECT foo FROM `imageTable` WHERE `id` = 'x' OR `id` = 'y' 
  OR `id` IS NOT NULL ORDER BY RAND() LIMIT 0, 12;

我希望带有 id 的记录一定会在结果集中,但不是 RAND() 会打乱整个集合。

所以我的问题是任何单个查询是否可以提供 x 个永久记录,然后提供 y 个随机记录?

// EDIT WITH REVISED QUERY 使用 Adrian Serafin 的回答:

(SELECT * FROM `imageTable` ORDER BY RAND() LIMIT 0, 6)
UNION
(SELECT * FROM `imageTable`  WHERE `id` = 'foo' OR `id` = 'bar' OR `id` = 'baz')

【问题讨论】:

    标签: sql mysql random


    【解决方案1】:

    你可以试试sql中的union命令。

    select random
      union
    select choosed
    

    【讨论】:

    • 感谢您的回复!效果很好!谢谢你教我新的!
    【解决方案2】:

    你可以试试联合...

    (SELECT foo FROM imageTable WHERE id not in ( 'x','y') ORDER BY RAND() LIMIT 0, 12; )
    UNION
    (SELECT foo FROM imageTable WHERE id in ('x','y')
    ORDER BY a LIMIT 10;
    

    【讨论】:

    • 谢谢约翰!我也不知道像这样使用 in ('x','y') ,所以我学会了两个新技巧。谢谢!
    【解决方案3】:

    将它们合并在一起,但防止 X 和 Y 显示不止一次 您还可以使用 IN 代替多个 OR 语句以更简洁。

    SELECT foo FROM (
        SELECT foo FROM `imageTable`
        WHERE id NOT IN ('x','y','z')
        ORDER BY RAND() LIMIT 0, 9    # reduce by 3
    ) A
    UNION ALL
    SELECT foo FROM (
        SELECT foo FROM `imageTable`
        WHERE id IN ('x','y','z')
    ) B
    ORDER BY RAND()    # order again so that x,y,z are anywhere in the set
    

    【讨论】:

    • 我的印象是,简单地使用UNION 而不是 代替UNION ALL 会消除结果中的重复项。现在,如果这是真的,我不确定这种消除是在 LIMIT 10 应用于随机查询之前还是之后发生的,这可能会导致问题......
    猜你喜欢
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    相关资源
    最近更新 更多