2014-02-17 69 views
0

我運行實時網站,它允許不同的用戶添加其屬性。 當有人搜索特定條件時,我們使用select語句以及指定的條件來選擇匹配的屬性,執行分頁位並顯示結果。限制搜索結果中字段值的數量

我們使用評級算法對每個屬性進行評分,並將其用於顯示屬性的優先級。

的簡化版本:

 
name   type  bedrooms   user score 
green house  sale  two bedrooms  alex 6 
Blue one  rent  three bedrooms  jack 6 
Blue one  sale  three bedrooms  jack 4 
gray one  sale  three bedrooms  jack 6 
green one  rent  three bedrooms  jack 6 
purple one  rent  three bedrooms  jack 6 
green one  rent  three bedrooms  jack 6 
green one  rent  three bedrooms  gary 6 

現在的問題是,有時一些屬性具有相同的分數。在這些情況下,我不希望一個用戶的屬性主導搜索結果頁面,我想設置一個限制,以在搜索結果頁面中顯示任何給定用戶的最多三個屬性。

在這個例子中,我不希望jack擁有的屬性主宰第一頁,而其他用戶的屬性轉到第二頁。這會打亂其他用戶,併爲訪問者創造糟糕的體驗。

如果我想只顯示給定用戶的一個屬性,我會使用Group by,但我不確定要限制爲較大數目(例如三個)。有什麼我可以在MySQL中做到這一點?

編輯:

對不起,如果它不夠清楚。

使用欄顯示添加特定屬性的用戶。示例查詢可能是

SELECT * FROM properties WHERE type = 'sale' LIMIT 5 ORDER BY score 

結果可能是五個屬性,全部由jack添加。我想確保只有特定用戶添加的屬性才包含在結果中。通過這種方式,其他用戶添加的屬性將有機會顯示。

+0

我們可以知道一些樣本輸入和期望的輸出嗎?我對用戶部分感到困惑,您的搜索結果是否可以被用戶過濾?如果不是,您是否希望第一頁上的不同用戶獲取最高3個分數? –

+1

@ICanHasCheezburger我想OP要從所有記錄中獲取每個用戶最多3條記錄 –

+0

顯示您的查詢 – Naeem

回答

1

在查詢中使用這樣的例子DISTINCT

SELECT DISTINCT列名,從表列名;

+0

在不同的查詢中使用column_name兩次會限制事件發生到兩個? – Hamid

1

使用DISTINCT它將解決您的問題。在一個表中,列可能包含許多重複值;有時您只想列出不同的(不同的)值。DISTINCT關鍵字可用於僅返回不同的(不同的)值。例如 SELECT DISTINCT user FROM table_name;

+0

不會將每個用戶添加的屬性數量限制爲1,而不是3? – Hamid

1

嘗試用這個和變化串your_table您的表名

SELECT 
    * 
FROM 
    `your_table` 
LEFT JOIN 
    (SELECT * FROM `your_table` LIMIT 3) as lr on lr.user = `your_table`.user 
GROUP BY 
    user 

reference link

更新2

如果你想通過你的分數,你可以使用

訂購

SELECT 
    * 
FROM 
    `your_table` 
LEFT JOIN 
    (SELECT * FROM `your_table` ORDER BY score DESC LIMIT 3) as lr on lr.user = `your_table`.user 
GROUP BY 
    user 
+0

我只是好奇,因爲我的桌子有大約70,000個屬性,這種方法不會導致嚴重的性能問題嗎? – Hamid

+0

可能會很慢,但如果您使用分頁,則可以使用限制。我認爲你不需要一次顯示所有記錄。 –