使用 Mysql 和 PHP...
我有一张广告表,广告可以来自 ad_category“汽车”或“一般”,我需要选择 10 行,但要确保我有 5 辆汽车和 5 条一般记录。
理想情况下,如果它只找到 3 辆汽车,然后选择 7 辆通用汽车。
这是由“SELECT distinct”完成的吗?和/或“分组”?
你可以用 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。
这些方面的东西可能会起作用(没有检查任何语法)。获得至少 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