2014-07-08 59 views
0

我想要一個MYSQL語句,它需要三個分數是4或5,並將它們排序在我的查詢結果的頂部。然後,結果應該是所有隨機後,但不是重複前2。在MySQL中做一個特殊排序,3個隨機最高分,比所有隨機

我試着做一個UNION ALL語句與相同的隨機數種子,但NOT IN語句不喜歡有一個「限制「在子查詢中。我想我需要在NOT IN語句之後對子查詢進行一些類型的轉換。思考?

select * from (select * from mydb.mytable where score in (5,4) order by rand(3423)  limit 3) toplist1 
UNION all 
select * 
from mydb.mytable allothers 
where allothers.reviewid NOT IN (select reviewid from mydb.mytable where score in (5,4)  order by rand(3423) limit 3) 
order by rand(45423) 

回答

1

也許......

Select * from (
    select A.*, 0 as OrderVal 
    from mydb.mytable A 
    where score in (5,4) 
    order by rand(3423)  
    limit 3) A 
UNION all (
    select *, 1 as orderval 
    from mydb.mytable allothers 
    where allothers.reviewid NOT IN (
    select reviewid 
    from mydb.mytable 
    where score in (5,4)  
    order by rand(3423) 
    limit 3) 
) B 
ORDER BY orderVal, rand(3423) 
+0

你的子選擇中的'order by'不是必需的。此外,這個查詢也遇到了與操作相同的問題。 'NOT IN'不一定會返回與第一個選擇相同的隨機3結果。 – Jenn

+0

奇數。我想,因爲我們想從每組中隨機選擇3個。然後最終的結果在orderval中是隨機的..但我可能是錯的。不會是第一次,也不會是最後一次。至於不在...是不是一個問題,OP要求修正或許這是所期望的。*聳聳肩* – xQbert

+0

嗯。其實,你可能是對的。我沒有真正考慮到我們會以相同的方式進行訂購的事實。有序隨機性。從微軟:對於指定的種子值,返回的結果始終是相同的 – Jenn

0

而不是做一個UNION ALL,使用聯盟。 Union All從您的所有選擇中拉回所有信息。 Union過濾出重複的記錄。本質上,它就像將整個查詢放入子查詢中,然後使用一個或一個獨立的組。

select * 
from mydb.mytable toplist1 
where score in (5,4) order by rand(3423) 
limit 3 

UNION 

select * 
from mydb.mytable allothers 
order by rand(45423) 

該查詢將撤回三條隨機記錄。然後,它將撤回表中的所有記錄,並將結果中的原始三條記錄過濾掉。然後,一切都以一張表格的形式返回。

+0

這是有效的,但奇怪的是我仍然需要通過子查詢以獲得訂單的工作 – tomriecken

+0

@tomriecken我不確定'subse subselects'的意思是什麼,順序應該按原樣工作,你能詳細說明你做了什麼來完成這項工作嗎? – Jenn