戈登提出的解決方案足以滿足當前需求。
如果我們預計未來優先級訂單的要求不是按字母順序排序(或按枚舉索引值)......
戈登的回答修改後的版本,我會非常想使用MySQL的FIELD
功能(它的逆)ELT
功能,這樣的事情:
SELECT p.name
, ELT(
MIN(
FIELD(p.access
,'read_only','read_write','read_some'
)
)
,'read_only','read_write','read_some'
) AS access
FROM `permissions` p
GROUP BY p.name
如果規範是拉動整個行,而不僅僅是access
列的值,我們可以使用內嵌視圖的查詢查找首選access
,並且加入回preferences
表來拉動全行...
SELECT p.*
FROM (-- inline view, to get the highest priority value of access
SELECT r.name
, MIN(FIELD(r.access,'read_only','read_write','read_some')) AS ax
FROM `permissions` r
GROUP BY r.name
) q
JOIN `permissions` p
ON p.name = q.name
AND p.access = ELT(q.ax,'read_only','read_write','read_some')
請注意,此查詢不僅返回具有最高優先級的access
,還會返回該行中的任何列的任何列。
使用FIELD
和ELT
函數,我們可以實現特定的已知值列表的任意特設排序。不只是按字母排序,還是按枚舉索引值排序。
「優先級」的邏輯可以包含在查詢中,並且不會依賴permissions
表中的額外列或任何其他表的內容。
要得到我們所尋找的行爲,只是規定了access
優先級,則在FIELD
函數中使用的「值列表」,將需要在ELT
功能匹配「值列表」,在同訂單,並且列表應該包括所有可能的值access
。
參考:
http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_elt
http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_field
高級使用
不是說你有一個要求,要做到這一點,但考慮可能的未來要求...我們注意到...
A 不同「值列表」的順序將導致access
的優先級的不同順序。因此,各種查詢都可以爲「優先級」實施各自不同的規則。其中access
值通過重新排序完整的「值列表」來查找第一,第二等。
不僅僅是重新排序,也可以省略從中FIELD
和ELT
功能「值列表」的可能值。例如,考慮在這條線省略從列表中'read_only'
值:
, MIN(FIELD(r.access,'read_write','read_some')) AS ax
,並從該行:
AND p.access = ELT(q.ax,'read_write','read_some')
這將有效地限制name
行返回。只有name
的access
值爲'read_write'
或'read_some'
。另一種方式看,name
有只有 a 'read_only'
對於access
將不是被查詢返回。
也可以對列表不匹配的「值列表」進行其他修改,以實現更強大的規則。例如,我們可以排除與'read_only'
有一排的name
。
例如,在ELT
函數中,取代'read_only'
值,我們使用一個我們知道不存在(也不能)存在於任何行的值。爲了說明這一點,
我們可以包括作爲'read_only'
該線路上「最高優先級」 ......
, MIN(FIELD(r.access,'read_only','read_write','read_some')) AS ax
^^^^^^^^^^^
所以如果有'read_only'
一行被發現,會被優先。但在外部查詢的ELT
功能,我們可以把這一回不同值...
AND p.access = ELT(q.ax,'eXcluDe','read_write','read_some')
^^^^^^^^^
如果我們知道'eXcluDe'
不在access
列中存在,我們已經有效地排除了任何name
它有一個'read_only'
行,即使有一個'read_write'
行。
不是說你有任何規範或目前的要求做任何。需要注意的是將來的查詢具有這些要求。
要做到這一點,最好的方法確實取決於「未來」數據在訪問中的樣子以及您希望返回的內容。例如,除非有「read_write」條目,否則您是否希望訪問按字母順序排序? – kbball