2011-09-06 35 views
3

我有兩列: 名字,姓氏(名字,姓氏)優先SQL查詢與多個OR

在查詢中,嘗試全名(例如:史蒂夫·喬布斯),然後我把話說成變量(在PHP),然後執行查詢:

SELECT * FROM `usuarios` WHERE 
(`nome` REGEXP '$bt1 $bt2') OR 
(`nome` REGEXP '$bt1') OR 
(`sobrenome` REGEXP '$bt1') OR 
(`sobrenome` REGEXP '$bt1 $bt2') 

的問題是,結果顯示沒有關注查詢的順序,然後結束返回:

Steve John 
John Jobs 
Steve Jobs 

我如何PR ioritize查詢並返回案例Steve Jobs

+1

我不認爲你解釋你要非常清楚。你想要一個結果?如果是這樣,你的where子句是不正確的。 –

回答

2

試試這個:

  (SELECT '1' as sb, usuarios.* FROM usuarios WHERE nom` REGEXP '$bt1 $bt2') 
UNION ALL (SELECT '2' as sb, usuarios.* FROM usuarios WHERE nome REGEXP '$bt1') 
UNION ALL (SELECT '3' as sb, usuarios.* FROM usuarios WHERE sobrenome REGEXP '$bt1') 
UNION ALL (SELECT '4' as sb, usuarios.* FROM usuarios WHERE sobrenome REGEXP '$bt1 $bt2') 
ORDER BY sb 
+0

我不明白這個部分:SELECT 1爲SB,* 而且它不工作...你能解釋一下它是如何工作的? –

+1

嘗試在1,2,3,4處添加引號:''1''或''1「'它基本上爲您的結果集添加了一個新列,您可以對其進行排序。與第一個查詢(全名)匹配的所有行在新sb列中的值爲1,並首先出現在排序結果集中。匹配最後一個查詢的行在新的sb列中的值爲「4」,並且最後出現在結果集中。 –

+0

所以我需要創建一個新的列SB?我在SB中放置什麼?這個代碼是否正確?我收到語法錯誤...(感謝您的幫助!) –

1

您可以隨時添加另一個錶行,使該指數爲優先,如:

SELECT * FROM `usuarios` WHERE 
(`nome` REGEXP '$bt1 $bt2') OR 
(`nome` REGEXP '$bt1') OR 
(`sobrenome` REGEXP '$bt1') OR 
(`sobrenome` REGEXP '$bt1 $bt2') 
ORDER BY `priority` ASC 

那樣!

1
SELECT usuarios.* 
FROM (
    (1 AS column, '$bt1 $bt2' AS pattern, 0 AS priority) UNION 
    (1, '$bt1', 1) UNION 
    (2, '$bt1', 2) UNION 
    (2, '$bt1 $bt2', 3) 
) AS items, 
INNER JOIN usuarios 
ON(ELT(items.column, usuarios.nome, usuarios.sobrenome) REGEXP items.pattern) 
ORDER BY items.priority 
2

既不是SQL查詢,也沒有默認順序。這是設計。如果您需要特定訂單,您總是必須提供ORDER BY條款;否則,行以任意順序返回(甚至不是隨機的!)。

在你的情況,如果我明白你的意思:

SELECT * 
FROM usuarios 
WHERE 
    nome REGEXP '$bt1 $bt2' OR 
    nome REGEXP '$bt1' OR 
    sobrenome REGEXP '$bt1' OR 
    sobrenome REGEXP '$bt1 $bt2' 
ORDER BY CASE 
    WHEN nome REGEXP '$bt1 $bt2' THEN 1 
    WHEN nome REGEXP '$bt1' THEN 2 
    WHEN sobrenome REGEXP '$bt1' THEN 3 
    WHEN sobrenome REGEXP '$bt1 $bt2' THEN 4 
END 

(我也刪除多餘的報價和括號,不是錯誤,只是一個忌諱)。

+0

好劇本,但不工作。經過一些修改(例如。:以 '拉斐爾·波特' - > $ BT1 =拉斐爾,$ BT2 =波爾圖): SELECT * FROM USUARIOS WHERE 諾姆REGEXP '拉斐爾·波特' OR 諾姆REGEXP '拉斐爾' OR sobrenome REGEXP '拉斐爾' OR 諾姆REGEXP '波爾圖' OR sobrenome REGEXP '波爾圖' OR sobrenome REGEXP '拉斐爾·波特' OR ORDER BY CASE WHEN諾姆REGEXP '拉斐爾·波特' THEN 1 WHEN諾姆REGEXP '拉斐爾' 和sobrenome REGEXP '波爾圖' THEN 2 當sobrenome REGEXP'porto'THEN 3 當sobrenome REGEXP'rafael porto'THEN 4 WHEN id ='rafael'OR id ='porto'THEN 5 END 結果與我的腳本相同 –

+0

您是否瞭解ORDER BY子句的作用?如果你這樣做,你不應該有任何問題來適應你的喜好。 –