Mysql选择了10条记录(5条是一种记录,5条是另一种记录)


Mysql select 10 records (5 of a kind and and 5 of another)

使用Mysql和PHP。。。

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

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

这是通过"SELECT distinct"完成的吗?和/或"分组依据"?

您可以使用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。

这些行中的某些内容可能会起到作用(没有检查任何语法)。至少买5辆车和10辆普通车,然后按车和普通车分类,然后再申请最后的10辆限制。如果存在的话,最多可以给你5辆车,并用general填充剩余的(即满足3辆车,7辆general的情况)。

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