【问题标题】:Mysql select 10 records (5 of a kind and and 5 of another)Mysql选择10条记录(一种5条,另一种5条)
【发布时间】:2013-09-01 06:54:27
【问题描述】:

使用 Mysql 和 PHP...

我有一张广告表,广告可以来自 ad_category "cars" 或 "general",我需要选择 10 行但确保我有 5 辆汽车和 5 条一般记录。

理想情况下,如果它只找到 3 辆汽车,然后选择 7 辆一般汽车。

这是由 "SELECT distinct" 完成的吗?和/或“GROUP BY”?

【问题讨论】:

    标签: php mysql database select distinct


    【解决方案1】:

    您可以使用union all 完成 5/5:

    (select *
     from ads
     where ad_category = 'cars'
     limit 5
    ) union all
    (select *
     from ads
     where ad_category = 'general'
     limit 5
    )
    

    编辑:

    如果你真的想要 10 条记录在你的情况下,你可以用这个技巧来做到:

    select *
    from ((select *, (@cars_rn := @cars_rn + 1) as rn
           from ads
           where ad_category = 'cars' cross join
                 (select @cars_rn := 0) const
           limit 10
          ) union all
          (select *, (@general_rn = @general_rn + 1) as rn
           from ads
           where ad_category = 'general' cross join
                 (select @general_rn := 0) const
           limit 10
          )
         ) t
    order by rn
    limit 10;
    

    这会选择 10 辆汽车和 10 辆普通汽车,并为每辆汽车分配一个连续的行号。然后它按行号排序并选择前 10 条记录。这将保证 10 条记录(假设至少有 10 条匹配),如果可能的话,将得到 5/5 的拆分。否则,它会取所有一个,并用另一个类别填写 10。

    【讨论】:

    • 看起来很简单,我用这个方法做的,然后测试我是否有 10 条记录,如果少,则重复查询并加载“任意”10 条记录。谢谢。
    【解决方案2】:

    沿着这些路线的东西可能会起作用(没有检查任何语法)。获得至少 5 辆汽车和至少 10 辆通用汽车,然后在应用最终 10 辆限制之前按汽车和通用汽车对它们进行分类。如果它们存在,则最多为您提供 5 辆汽车,并用一般情况填充剩余的汽车(即满足 3 辆汽车,7 辆一般情况)。

    SELECT x.ad
      FROM ( ( SELECT 1 AS pref, ad
                 FROM ads
                 WHERE ad_category = 'cars'
                 LIMIT 5
              )
    
              UNION
    
              ( SELECT 2 AS pref, ad
                  FROM ads
                  WHERE ad_category = 'general'
                  LIMIT 10
              )
            ) AS x
      ORDER BY x.pref, x.ad
      LIMIT 10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-05
      • 2015-09-05
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多