2013-12-23 55 views
0

如何確保IDTAG列的第一個出現的不重複?MySQL的:首先排序每次出現,之後的剩餘

實施例:IDTAG出現前4(IN子句內的值的大小)不能85,85,85,90

DB模式:http://sqlfiddle.com/#!2/0a683/2

我不通過使用基團,因爲有時我需要在IN子句內限制多個ID。如果我使用實例:

SELECT 
tr.idreceita, 
tr.idtag 
FROM tagreceita tr 
WHERE tr.idtag IN (85,88,90) 
GROUP BY tr.idtag 
LIMIT 4 

這將是理想的,如果它導致4行僅值允許在tr.idtag IN(85,88,90)

謝謝!

+0

'我不使用group by,因爲有時我需要限制比ID的數量更多的內部,也clause'指定查詢此情況下,請 – zzlalani

+0

只是想和你三個結果中記錄集? 'IN(85,88,90)' – zzlalani

+0

我試圖改善這個問題。 –

回答

1

的正確方法是使用聚合:

SELECT min(tr.idreceita), tr.idtag 
FROM tagreceita tr 
WHERE tr.idtag IN (85,88,90) 
group by tr.idtag; 

編輯:

我明白了,有時候你想要更多的東西都是在in列表。在這種情況下,可能是最簡單的方法是隨機的結果:

select tr.idreceita, tr.idtag 
from tagreceita tr 
where tr.idtag IN (85,88,90) 
order by rand(); 

這並不能保證唯一性,但它是一個簡單的解決方案。

編輯II:

正式的解決方案以獲得平衡的結果使用變量(或row_number()在幾乎任何其他數據庫):

select idreceita, idtag 
from (select tr.idreceita, tr.idtag, 
      @rn := if(@idtag = tr.idtag, @rn + 1, 1) as rn, 
      @idtag := tr.idtag 
     from tagreceita tr cross join 
      (select @rn := 0, @idtag := -1) const 
     where tr.idtag IN (85, 88, 90) 
     order by tr.idtag 
    ) t 
order by rn, idtag 
order by rand(); 
0

值中的前4個(大小IN子句)idtag發生次數不能是85,85,85,90

恩,你已經在那裏重複了85次三次。以一個簡單的情況下,你不想85,90出現在第2項....

SELECT 
tr.idreceita, 
tr.idtag 
FROM tagreceita tr 
WHERE tr.idtag IN (85,88,90) 
ORDER BY idtag IN (85,90), idtag 

id IN (85,90)給取決於它是否是真的還是假的0或1的值。

我不完全理解你的意思是沒有出現在前四行中的兩個值 - 也許如果你可以提供更詳細的解釋(包括試圖達到這個目的的原因),那麼我可能能夠想出更適合的解決方案。