2013-06-18 178 views
3

我有一個有兩列(entry_id和CATEGORY_ID)精確匹配,那麼部分匹配

entry_id | category_id 
52 | 44 
55 | 47 
58 | 50 
55 | 55 
58 | 52 
53 | 51 
58 | 56 
61 | 56 

如何選擇標記有CATEGORY_ID 50和56(精確匹配)中的所有條目的表中調用的帖子第一然後爲了通過部分匹配其餘的 - 項只有CATEGORY_ID = 50,標記56個

感謝下一條目,標記

回答

4

你需要通過彙總錄入數據,然後套用階條件:

select entry_id 
from posts 
group by entry_id 
order by max(category_id = 50) + max(category_id = 56) desc 

表達max(category_id = 50)返回1如果50類是在混合(對於條目)和0否則。通過一起添加這兩個表達式,您可以獲得類別匹配的數量。

如果你關心的單場比賽的順序(對這個問題的建議),然後執行:

select entry_id 
from posts 
group by entry_id 
order by max(category_id = 50) + max(category_id = 56) desc, 
     max(category_id = 50) desc, 
     max(category_id = 56) desc 

編輯:

如果您存儲可用類別以逗號分隔的列表,那麼你可以擁有最好的世界。您可以通過匹配的類別數量(第一個)進行排序。然後,您可以使用該列表來優先分類。而且,您可以確保具有相同類別的所有實體一起出現。它只需要字符串操作。

表達:

count(distinct (case when find_in_set(category_id, @categories) > 0 then category_id end)) 

將計數的類別是在列表中的號碼(實體)。

表達:

group_concat((case when find_in_set(category_id, @categories) > 0 
        then find_in_set(category_id, @categories) 
       end) 

將創建其中元素表示該串中的位置的字符串。因此,如果您通過'a,b,c;且實體匹配'b''c',則字符串將是'2,3'。如果它有全部三個,那麼它將是'1,2,3'。這提供了您需要優先化的內容。

最後,在結尾處增加entity_id可使排序穩定:

order by count(distinct (case when find_in_set(category_id, @categories) > 0 then category_id end)) desc, 
     group_concat((case when find_in_set(category_id, @categories) > 0 
          then find_in_set(category_id, @categories) 
         end) 
         order by find_in_set(category_id, @categories)), 
     entry_id 
+0

謝謝你,只是一個簡單的問題是:如果我不知道類別出來的確切順序,我會怎麼修改這個?基本上,數據是以隨機順序輸出,具體取決於頁面? – Daniel

+0

@Daniel。 。 。在entry_id上的'order by'子句中添加最後的排序。這將使排序穩定。 –

+0

這將如何工作,但如果category_id動態出現而不是按照這個順序?例如,在一個實例中,它可能如上所述是50和56,但在另一個實例中,輸出可能是44 | 50 | 52 | 56。基本上entry_id被分配到多個和多個類別,所以如果我通過PHP獲取值,我將如何動態地將這些值放入查詢中? – Daniel