我有一個有兩列(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個
感謝下一條目,標記
我有一個有兩列(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個
感謝下一條目,標記
你需要通過彙總錄入數據,然後套用階條件:
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
謝謝你,只是一個簡單的問題是:如果我不知道類別出來的確切順序,我會怎麼修改這個?基本上,數據是以隨機順序輸出,具體取決於頁面? – Daniel
@Daniel。 。 。在entry_id上的'order by'子句中添加最後的排序。這將使排序穩定。 –
這將如何工作,但如果category_id動態出現而不是按照這個順序?例如,在一個實例中,它可能如上所述是50和56,但在另一個實例中,輸出可能是44 | 50 | 52 | 56。基本上entry_id被分配到多個和多個類別,所以如果我通過PHP獲取值,我將如何動態地將這些值放入查詢中? – Daniel