2011-12-16 24 views
22

Tôi đang cố gắng thiết lập một vài kịch bản lệnh SQL đơn giản để trợ giúp với một số quản trị viên DB ngắn hạn. Vì vậy, tôi đang thiết lập các biến để cố gắng sử dụng lại các tập lệnh này dễ dàng hơn.Cách sử dụng biến người dùng trong mệnh đề MySQL LIKE?

Sự cố tôi gặp phải là cụ thể với mệnh đề LIKE.

SET @email = '[email protected]'; 

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

Vì vậy, tôi muốn tìm kết quả dựa trên email SET trong biến. Truy vấn hoạt động nếu tôi nhập email theo cách thủ công vào mệnh đề LIKE.

Làm cách nào để nhận mệnh đề LIKE để hoạt động với biến người dùng?

CẬP NHẬT: câu trả lời của @ dems hoạt động cho trường hợp đơn giản này, nhưng tôi đang gặp sự cố với truy vấn phức tạp hơn.

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, '%') 

Cung cấp cho tôi những lỗi "CHỨC NĂNG mydb.CONCAT không tồn tại"

Truy vấn làm việc mà không có sự 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

nhân vật không gian Remove giữa 'CONCAT' và cú đúp '('. Nó phải là 'CONCAT (...', không phải 'CONCAT (' – a1ex07

+0

@ a1ex07 Có, bỏ không gian đó đã sửa nó. Cảm ơn. – Chris

+0

Tôi biết chúng ta không dạy ngữ pháp ở đây nhưng chắc chắn tôi không thể là người duy nhất bị làm phiền bởi lỗi trong tiêu đề câu hỏi, "Cách sử dụng ** biến người dùng ** trong mệnh đề MySQL LIKE?" – qualebs

Trả lời

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

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

Điều này làm việc cho trường hợp đơn giản này, tôi mở rộng truy vấn của tôi để bao gồm một số JOINS và bây giờ nó cho tôi một lỗi nói với tôi rằng "FUNCTION mydb.CONCAT không tồn tại". phát hiện ra rằng (SET @email = '%[email protected]%';) cho phép tôi bỏ qua CONCAT, nhưng tôi không thích ghép nối cú pháp tìm kiếm với dữ liệu. – Chris

+0

@Chris - Bạn cần hiển thị truy vấn mới của mình như một toàn thể sau đó, vì phải có một số lỗi mới trong nó. CONCAT() chỉ tham gia nhiều chuỗi với nhau, một d trong ví dụ của tôi sử dụng một biến là một trong các chuỗi. – MatBailie

+0

Có, tôi đã cập nhật câu hỏi ban đầu với truy vấn phức tạp hơn. – Chris

0

Sử dụng cùng một cú pháp như oracle dường như công việc:

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

+0

cho MySQL cú pháp này không hoạt động –

+0

Giải pháp của bạn không không lọc các trường chỉ chứa 'email'. Nó thực sự trả về tất cả các lĩnh vực như cú pháp của bạn có nghĩa là 'email' HOẶC bất cứ điều gì khác –

1

trình mà không concat():

LIKE '%{$var}%' 

(Mysql phiên bản 5. +)

+0

Đây có phải là một câu trả lời hỗ trợ php? –

+0

Đó là tùy thuộc vào SQL injection. – AlxVallejo

0

Bạn có thể có lỗi

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

Trong trường hợp này, bạn cần phải xác định đối chiếu tương tự như sử dụng cho bảng của bạn như thế:

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

Tôi đã giải quyết bằng hàm CONCAT trước chúng tôi ing NHƯ tuyên bố:

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

Nó hoạt động tốt đối với tôi

Các vấn đề liên quan