2011-12-16 10 views
22

Próbuję skonfigurować kilka prostych skryptów SQL, aby pomóc w krótkoterminowej administracji DB. W związku z tym konfiguruję zmienne, aby ułatwić ponowne użycie tych skryptów.Jak używać zmiennych użytkownika w klauzuli MySQL LIKE?

Problem, który mam, dotyczy konkretnie klauzuli LIKE.

SET @email = '[email protected]'; 

SELECT email from `user` WHERE email LIKE '%@email%'; 

Chciałbym, aby to było znalezienie wyników w oparciu o e-mail SET w zmiennej. Zapytanie zadziała, jeśli ręcznie wprowadzę wiadomość e-mail do klauzuli LIKE.

Jak uzyskać klauzulę LIKE do pracy ze zmienną użytkownika?

AKTUALIZACJA: @ odpowiedź dems działa dla tego prostego przypadku, ale mam problem z bardziej złożonym zapytaniem.

SET @email = '[email protected]'; 

SELECT project.projectno, project.projectname, login.username, 
CONCAT(login.firstname, ' ', login.lastname), projectuser.title 
FROM projectuser 
INNER JOIN login ON projectuser.uid = login.uid 
LEFT JOIN project ON projectuser.pid = project.pid 
WHERE login.username LIKE CONCAT ('%', @email, '%') 

daje mi błąd "Funkcja mydb.CONCAT nie istnieje"

Kwerenda działa bez CONCAT():

SET @email = '[email protected]'; 

SELECT project.projectno, project.projectname, login.username, 
CONCAT(login.firstname, ' ', login.lastname), projectuser.title 
FROM projectuser 
INNER JOIN login ON projectuser.uid = login.uid 
LEFT JOIN project ON projectuser.pid = project.pid 
WHERE login.username LIKE @email 
+1

Usuwanie spacji między 'CONCAT' i klamra' ('. Powinno to być 'CONCAT (...', nie 'CONCAT (' – a1ex07

+0

@ a1ex07 Tak, usunięcie tego miejsca naprawiło To dziękuję – Chris

+0

Wiem, że nie uczymy gramatyki tutaj, ale na pewno nie mogę być jedynym, który dręczył przez błąd w tytule pytania: "Jak używać ** zmiennych użytkownika ** w klauzuli MySQL LIKE?" – qualebs

Odpowiedz

45
SET @email = '[email protected]'; 

SELECT email from `user` WHERE email LIKE CONCAT('%', @email, '%'); 
+0

To działa w tym prostszym przypadku: rozszerzyłem moje zapytanie, aby dołączyć kilka powiązań, a teraz daje mi błąd informujący, że "FUNKCJA mydb.CONCAT nie istnieje". Zauważyłem, że (SET @email = '%[email protected]%';) pozwala mi pominąć CONCAT, ale nie lubię parowania składni wyszukiwania z danymi – Chris

+0

@Chris - Musisz pokazać swoje nowe zapytanie jako całość, ponieważ musi być w nim jakiś nowy błąd, CONCAT() po prostu łączy ze sobą kilka ciągów, an d w moim przykładzie używa zmiennej jako jednego z łańcuchów. – MatBailie

+0

Tak, zaktualizowałem pierwotne pytanie za pomocą bardziej złożonego zapytania. – Chris

0

Stosując tę ​​samą składnię jak Oracle wydaje praca:

SELECT email from user WHERE email LIKE '%' || @email || '%';

+0

dla MySQL ta składnia nie działa –

+0

Twoje rozwiązanie nie działa nie filtrować pól zawierających tylko "e-mail". Faktycznie zwraca wszystkie pola, ponieważ składnia oznacza "e-mail" lub cokolwiek innego. –

1

działa bez concat():

LIKE '%{$var}%' 

(MySQL w wersji 5. +)

+0

Czy to ma być pomoc php? –

+0

To podlega iniekcji SQL. – AlxVallejo

0

Możesz mieć błąd

Error Code: 1267. Illegal mix of collations for operation 'like' 0.016 sec 

W tym przypadku trzeba podać ten sam jak używany do sortowania Twój stół w ten sposób:

SET @email = '[email protected]' COLLATE utf8_unicode_ci; 
0

Postanowiłem użyć funkcji CONCAT przed nami ING LIKE oświadczenie:

SET @email = '[email protected]'; 
set @email = CONCAT('%',@email,'%'); 
SELECT email from `user` WHERE email LIKE @email; 

To działa dobrze dla mnie