2011-08-11 18 views
14

Mam tabelę klientów z dwiema kolumnami first_name i last_name.Jak zrobić LIKE biorąc pod uwagę dwie kolumny?

W jaki sposób mogę użyć LIKE w zapytaniu, aby uzyskać dane z obu kolumn o tej samej nazwie?

Na przykład:

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

Próbowałem to i to mówi mi full_name kolumny nie istnieje.

+0

[Full Text Search] (http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html) jest najbardziej wydajne oznacza w SQL, aby robić to, co chcesz. –

+0

@OMG Ponieważ mogłem zmienić tabelę i wstawienie danych, utworzyłem nową kolumnę indeksowaną full_name i wykorzystałem ją zamiast tego z powodu problemów wydajności wymienionych w odpowiedziach. – RedDragon

Odpowiedz

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

Możesz również przyciąć nazwę pierwszą i ostatnią, aby uwzględnić ewentualne dodatkowe spacje w kolumnach. – Narnian

+1

Możesz również sprawdzić wariant "nazwisko, imię", jeśli użytkownik może to również wprowadzić. – Narnian

+0

Tak prosty, genialny. danke :) – arjunaaji

5

Jesteś prawie tam

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

Uwaga: to nie może mieć bardzo dobrą wydajność. Możesz rozważyć full text search.

0

Nie mam MySql pod ręką, ale czy nie możesz zrobić czegoś takiego jak poniższy kod?

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

Nota prawna: TO MOŻE BYĆ BARDZO SLOWNY !!!

4

Zastosowanie HAVING zamiast WHERE:

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

Dlaczego HAVING zamiast WHERE? –

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

może być bardzo powolny, ale to nie będzie miało znaczenia, jeśli baza danych jest dość małe. Podczas korzystania z CONCAT upewnij się, że sortowanie jest takie samo dla obu nazw kolumn, ponieważ spowoduje to błąd.

Poniżej znajduje się oświadczenie, w którym chcę, aby moje oświadczenie LIKE działało zarówno dla nazwy kategorii, jak i nazwy kursu. Sprawdzam cat_id w obu tabelach, dzięki czemu mogę mieć pojęcie, który kurs należy do której kategorii.

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 

: imię zastępczy (PDO)

Powiązane problemy