使用MySQL和PHP ...Mysql的選擇10條(一種5和5的另一個)
我有廣告表,廣告可以從ad_category「汽車」或「一般」,我需要選擇10行,但確保我有5輛汽車和5個一般記錄。
理想情況下,如果它只發現3輛車,然後選擇7將軍。
這是由「SELECT distinct」完成的嗎?和/或「GROUP BY」?
使用MySQL和PHP ...Mysql的選擇10條(一種5和5的另一個)
我有廣告表,廣告可以從ad_category「汽車」或「一般」,我需要選擇10行,但確保我有5輛汽車和5個一般記錄。
理想情況下,如果它只發現3輛車,然後選擇7將軍。
這是由「SELECT distinct」完成的嗎?和/或「GROUP BY」?
你可以做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
這看起來很簡單,我用這種方法做的,然後再測試,如果我有10條記錄,如果少的話,我重複查詢和負載「任意」 10條記錄。謝謝。 – adrianTNT