2013-08-29 26 views
0

使用MySQL和PHP ...Mysql的選擇10條(一種5和5的另一個)

我有廣告表,廣告可以從ad_category「汽車」或「一般」,我需要選擇10行,但確保我有5輛汽車和5個一般記錄。

理想情況下,如果它只發現3輛車,然後選擇7將軍。

這是由「SELECT distinct」完成的嗎?和/或「GROUP BY」?

回答

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

+0

這看起來很簡單,我用這種方法做的,然後再測試,如果我有10條記錄,如果少的話,我重複查詢和負載「任意」 10條記錄。謝謝。 – adrianTNT

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 
相關問題