2016-05-24 52 views
1

我想使用PHP和SQL進行良好的搜索。我正在考慮使用SQL運算符LIKE(例如:SELECT * FROM Customers WHERE Country LIKE '%land%'),但我希望顯示的第一個元素是以「land」開頭的元素。我怎樣才能做到這一點?我不想對數據庫執行多個查詢,因爲我認爲這是一個壞主意(但我可能是錯的)。使用SQL搜索

+3

'LIKE「%的土地」'你去那裏。 –

+0

是的,我知道,但我想顯示其他解決方案,因爲這個原因我正在使用LIKE。 – CCT

+0

你需要澄清你的意思。如果你想讓那些以'land'作爲@ Fred-ii-開始的建議。如果你想要更多的其他結果解釋。 – chris85

回答

5

您可以通過該國是否與land開始訂購。 MySQL的,我猜你使用,在數值範圍內引用時翻譯真/假以1/0的實用的功能,所以這將是很容易做到:

SELECT * 
FROM  Customers 
WHERE Country LIKE '%land%' 
ORDER BY Country LIKE 'land%' DESC 

其他RDBMS可能沒有這樣的待遇布爾的,但你可以自己一個case表達始終貫徹它:

SELECT * 
FROM  Customers 
WHERE Country LIKE '%land%' 
ORDER BY CASE WHEN Country LIKE 'land%' THEN 1 ELSE 0 END DESC 
+0

或者,根據不同的方言,像'ORDER BY strpos('land',Country)'? – MatBailie

+0

@MatBailie是的,這也會起作用。對於長字符串,'LIKE'方法應該更好一些,因爲我們並不真正關心'strpos'之類的結果,只是它是否爲1。 – Mureinik

2

我建議不要使用LIKE來實現搜索,它有很多限制。但是,如果你的使用情況很簡單,在這裏你去:

SELECT 1 as orderby, * 
FROM Customers 
WHERE Country LIKE 'land%' 
union all 
SELECT 2, * 
FROM Customers 
WHERE Country LIKE '_%land%' 
order by orderby 

這種方法允許你創建排序

1

這幾個級別將返回任何與land第一,然後一切開始。 您需要專門列出您的字段。

SELECT field1, field2, field3, etc 
FROM customers 
WHERE country LIKE 'land%' 
UNION ALL 
SELECT field1, field2, field3, etc 
FROM customers 
WHERE country LIKE '%land%' 
AND country NOT LIKE 'land%' 

或使用查詢的第二部分子查詢,如果您說customerid場。

SELECT field1, field2, field3, etc 
FROM customers 
WHERE country LIKE 'land%' 
UNION ALL 
SELECT field1, field2, field3, etc 
FROM customers 
WHERE country LIKE '%land%' 
AND customerid NOT IN (SELECT customerid 
         FROM customers 
         WHERE country LIKE 'land%') 
2

UNION運算符是你在找什麼:

SELECT * FROM Customers 
WHERE Country LIKE 'land%' 
UNION 
SELECT * FROM Customers 
WHERE Country LIKE '%land%';