2015-10-23 51 views
-3

請參閱圖像中的結果字段 - > dep_fields。Mysql排序滿足multipe condtion

具有值dep_fields 11,29應該首先,因爲它滿足多個條件FIND_IN_SET(11,dep_fields),FIND_IN_SET(29,dep_fields

在第二爲了滿足只有一個條件FIND_IN_SET(29,dep_fields)。

我需要排序,它滿足字段dep_fields的where子句條件。

SELECT * FROM mascot_question 
    WHERE `dependent` = 8 
    AND (
    FIND_IN_SET(11,`dep_fields`) 
    OR FIND_IN_SET(14,`dep_fields`) 
    OR FIND_IN_SET(16,`dep_fields`) 
    OR FIND_IN_SET(26,`dep_fields`) 
    OR FIND_IN_SET(29,`dep_fields`) 
    OR `dep_fields` = "" 
    ); 

enter image description here

我需要訂貨,滿足更多的where子句條件的領域dep_fields。 (又名,排序最FIND_IN_SET匹配)

+1

你的問題不清楚你想達到什麼目的! –

+0

我需要一個字段滿足更多條件的順序。 – Selvaraj

回答

4

您可以使用:

ORDER BY 
    IF(FIND_IN_SET(11,`dep_fields`), 1, 0) 
    + IF(FIND_IN_SET(14,`dep_fields`), 1, 0) 
    + IF(FIND_IN_SET(16,`dep_fields`), 1, 0) 
    + IF(FIND_IN_SET(26,`dep_fields`), 1, 0) 
    + IF(FIND_IN_SET(29,`dep_fields`), 1, 0) DESC 

這將增加1每場比賽,並且爲了通過總。

您還應該重新考慮在表格字段中使用逗號分隔列表。最好用多對多的關係表來規範化。這使匹配字段的效率更高(FIND_IN_SET無法使用索引),並且您可以使用COUNT(*)來計算匹配數量並按其順序排列。

+0

根據[手冊](https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set)find_in_set返回列表中項目的索引。這不是布爾函數 – arilia

+0

糟糕,忘記了。我已經解決它使用'IF'來標準化它們爲布爾值。 – Barmar

+0

是的,表格內容很小,所以我沒有在此使用n-n關係。非常感謝你... :) – Selvaraj