2011-08-11 6 views
14

私はfirst_namelast_nameという2つの列を持つ顧客テーブルを持っています。2つの列を考慮して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%' 

免責事項:これは非常にSLOWすることができ!!!代わりにWHERE

4

使用HAVING

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

WHEREの代わりにHAVINGを使用する理由 –

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)

関連する問題