2011-08-11 68 views
14

我有一個客戶表,有兩列first_namelast_name如何做一個LIKE考慮兩列?

如何在查詢中使用LIKE從同時馴服的兩列中獲取數據?

例如:

SELECT CONCAT(first_name, ' ', last_name) as 'full_name' 
FROM customer WHERE full_name LIKE 'John D%' 

我試過這個,它告訴我full_name列不存在。

+0

[全文搜索](http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html)是最SQL中有效的手段來做你想做的事情。 –

+0

@OMG由於我可以更改表和數據插入,我創建了一個新的索引列full_name並使用它,而不是由於回答中提到的性能問題。 – RedDragon

回答

31
SELECT CONCAT(first_name, ' ', last_name) as 'full_name' 
FROM customer WHERE CONCAT(first_name, ' ', last_name) LIKE 'John D%' 
+1

您可能還想修剪first_name和last_name以考慮列中可能的多餘空格。 – Narnian

+1

如果用戶也可以輸入,也可以檢查「姓氏,名字」變體。 – Narnian

+0

太簡單了,精彩。 danke :) – arjunaaji

5

你幾乎沒有

SELECT * 
FROM customer 
WHERE CONCAT(first_name, ' ', last_name) LIKE 'John D%' 

注:這可能不會有很好的表現。你可能要考慮full text search

0

我手邊沒有MySql,但不能做類似下面的代碼?

SELECT CONCAT(first_name, ' ', last_name) as 'full_name' 
FROM customer WHERE CONCAT(first_name, ' ', last_name) LIKE 'John D%' 

聲明:這可能會非常慢!

4

使用HAVING代替WHERE

SELECT CONCAT(first_name, ' ', last_name) as 'full_name' 
    FROM customer HAVING full_name LIKE 'John D%' 
+1

爲什麼HAVING而不是WHERE? –

0
SELECT * 
FROM customer 
WHERE CONCAT(first_name, ' ', last_name) LIKE 'John D%' 

可能會很慢,但如果你的數據庫是非常小的,不會沒關係。在使用CONCAT時,請確保兩個列名稱的排序規則相同,否則會提取錯誤。

以下是我希望我的LIKE聲明適用於類別名稱和課程名稱的聲明。我檢查兩個表中的cat_id,以便我可以知道哪個課程屬於哪個類別。

SELECT * FROM courses a INNER JOIN categories b ON a.cat_id=b.cat_id 
WHERE CONCAT(b.cat_name,' ',a.course_name) 
LIKE :name ORDER BY b.cat_id 

:名稱是佔位符(PDO)