2012-07-22 66 views
0

我正在研究一個項目,該項目將使用比較投票邏輯將最高評分排序到最高和最低排序(類似於「hot or not」或「Hotstagram」) 。基本上我需要做的是將2張隨機圖片直接放在數據庫中,並讓用戶投票,給贏家增加一分,並從輸家中減去最高點到最高點。使用SQL進行投票/排序邏輯

我的問題是兩倍,我怎樣才能得到一個MySql數據庫中的隨機項目,然後直接在它旁邊獲得一個隨機項目。其次(如果有人有此事的經驗),你會如何構建你的數據庫?我想圖像的一個表和第二個將持有的票(然後在頁面加載編譯結果)。我想我的關注點在於,對於排名,新輸入的照片將從零開始,因此您可以獲得X張相同排名的照片?我只是在那裏拋出一些想法,我需要另一個想法來拋棄它。

回答

2

您可以使用Order by Rand()函數從數據庫中獲取隨機記錄。

SELECT * FROM tbl_name ORDER BY RAND();

您還可以限制這兩行很輕鬆地爲這樣的:

SELECT * FROM tbl_name ORDER BY RAND() limit 2;

然而這會從DB兩個隨機行,不連續的兩行。

如果你想得到兩個隨機的連續行,你可以運行一個查詢來獲取ID和一個子查詢來獲得它後面的下一個ID。

至於保留一個/兩個表中的數據,一定要保存在兩個表中。將您保存投票的第二張表格鏈接到圖片的ID。顯然根據需要在鏈接(和其他字段)上添加索引。

編輯:下面是代碼,讓你的數據的兩個後續行中的一行,則:

select 
    a.id, 
    (
     select 
      min(c.id) 
     from 
      table1 c 
     where 
      c.id>a.id 
     limit 1 
    ) as id2 
from 
    table1 a 
order by 
    rand() 
limit 1; 

編輯2:如果你希望他們爲不同的行中的各種其他位的拉動,我提供了下面的查詢。我用了一個額外的子查詢,就好像初始查詢發生的使用順序時蘭特(拉出最大值(可能的),那麼它解決了只返回一行數據的問題。

select 
    b.id 
from 
    table1 b, 
    (
    select 
     a.id as id 
    from 
     table1 a 
    where 
     a.id<(select max(id) from table1 limit 1) 
    order by 
     rand() 
    limit 1 
    ) a 
where 
    b.id>=a.id 
    order by 
    b.id 
limit 2 
; 
+0

是的,看起來子查詢將是不幸的唯一選擇。 – 2012-07-22 13:54:26

+0

@GThompson好吧,我現在添加了查詢來爲您返回兩個連續的記錄。 – Fluffeh 2012-07-22 14:02:51

+0

@GThompson我還添加了一個查詢來將兩個連續的記錄拖到不同的行中,並且包含一個子查詢,以確保在獲取隨機行時獲取兩行數據。 – Fluffeh 2012-07-22 14:25:17

1

這裏是另一種方式拿到爲了兩個隨機行:

with first as (select id 
       from table t 
       where id < (select max(id) from table) 
       order by rand() 
       limit 1 
      ) 
select id 
from table t 
order by abs(id - first.id) 
limit 2 

對於結構化數據你可能會想一個是照片,一種針對用戶,一個針對「報價」(對照片與用戶ID),和一個投票通常變得非常重要,知道什麼用戶沒有投票,以及他們投票。

如果您想以相同的排名打破照片上的關係,可以使用照片首次進入系統的日期,優惠數量或兩者的組合。