0

使用 Mysql 和 PHP...

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

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

这是由“SELECT distinct”完成的吗?和/或“分组”?

4

2 回答 2

2

你可以用 5/5 来做union all

(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。

于 2013-08-29T01:16:13.043 回答
0

这些方面的东西可能会起作用(没有检查任何语法)。获得至少 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
于 2013-08-29T01:21:40.170 回答