WHERE yan tümcesinde mysql concat () kullanıyorsunuz?

5 Cevap php

Ben ilk isimlerden bir sütun ve soyadları bir sütun olan benim masa aramak istiyorum. Ben şu anda bir alana bir arama terimini kabul etmek ve bir seferde, iki sütun karşı bir karşılaştırmak

    select * from table where first_name like '%$search_term%' or 
    last_name like '%$search_term%';

Bu tek kelime arama terimleri ile çalışıyor ancak sonuç kümesi adı "Larry" ile herkesi kapsar. Birisi bir ilk adını daha sonra bir soyadı sonra bir boşluk, girerse ama, ben dar bir arama sonucunu istiyorum. Ben başarı olmadan aşağıdakileri denedim.

    select * from table where first_name like '%$search_term%' or last_name 
    like '%$search_term%' or concat_ws(' ',first_name,last_name) 
    like '%$search_term%';

Herhangi bir tavsiye?

EDIT: Ben test ediyorum adı "Larry Smith" dir. Db "son_ad" sütununda "first_name" sütununda ve "Smith" mağazalar "Larry". Veriler, fazladan boşluk temiz ve arama terimi sol ve sağ kesilmiş.

EDIT 2: Bu sabah, Robert Gamble'ın cevabını çalıştı. Onun Dün gece çalışan ne çok benzer. Bunu açıklayamam, ama bu sabah çalışır. Aklıma tek fark, dün gece (FIRST_NAME ve last_name geçirdikten sonra) benim arama sorgusu üçüncü "veya" segment olarak concatı işlevini koştu olmasıdır. Bu sabah yanı sıra yukarıdaki adresleri ve iş isimleri geçirdikten sonra son segment olarak koştu.

Daha ortada daha bir sorgu işin sonunda bir mysql fonksiyonu çalışıyor mu?

5 Cevap

Ne var çalışması gerektiğini, ancak azaltılabilir:

select * from table where concat_ws(' ',first_name,last_name) 
like '%$search_term%';

Eğer bir örnek adı ve bu işe yaramazsa arama terimini sağlayabilir?

Arama sorgusu şimdi harf duyarlı olduğunu unutmayın.

Kullanırken

SELECT * FROM table WHERE `first_name` LIKE '%$search_term%'

Bu "Larry" ve "Larry" iki maç olacak. Bu CONCAT_WS ile, aniden harf duyarlı olacak!

Bu aşağıdaki sorguyu kullanarak tespit edilebilir:

SELECT * FROM table WHERE UPPER(CONCAT_WS(' ', `first_name`, `last_name`) LIKE UPPER('%$search_term%')

Düzenleme: Bu sadece ikili olmayan elemanların çalıştığını unutmayın. Ayrıca bakınız mynameispaulie's answer.

Luc için:

Ben ÜST sadece ikili olmayan unsurları üzerinde çalıştığını eklemek istiyorum, ancak ben senin cevap katılıyorum. Eğer YAŞ sütun (veya sayısal bir şey) diyelim ile çalışıyorsanız doğru ÜST fonksiyon çalışması için bir CAST dönüşüm gerçekleştirmek gerekir.

SELECT * FROM table WHERE UPPER(CONCAT_WS(' ', first_name, last_name, CAST(age AS CHAR)) LIKE UPPER('%$search_term%');

Doğrudan Luc'un cevap yanıt için beni affedin ama beni yaşam için ben bunu nasıl çözemedim. Bir yönetici benim yazı taşıyabilirsiniz, lütfen bunu yapın.

SELECT *,concat_ws(' ',first_name,last_name) AS whole_name FROM users HAVING whole_name LIKE '%$search_term%'

... Ne istediğinizi muhtemelen.

Şekilde alabilir birkaç şey var - veri temiz?

Bu, o zaman bunları CONCAT zaman ad ve soyad arasında iki boşluk var demektir ilk adı alanına, sonunda boşluk var olabilir? (First_name) / (LAST_NAME) Trim kullanarak bu çözecektir - gerçek düzeltme verileri güncellemek için olmasına rağmen.

Ayrıca, bu maç için nerede iki kelimeyi bir araya mutlaka oluşmaz ancak ikisini (php olduğunuzu varsayarak - $ SEARCH_TERM değişken sen göstermektedir)

$whereclauses=array();
$terms = explode(' ', $search_term);
foreach ($terms as $term) {
    $term = mysql_real_escape_string($term);
    $whereclauses[] = "CONCAT(first_name, ' ', last_name) LIKE '%$term%'";
}
$sql = "select * from table where";
$sql .= implode(' and ', $whereclauses);