MySQL: Đặt biến người dùng từ kết quả của truy vấn


195

Có thể đặt biến người dùng dựa trên kết quả của truy vấn trong MySQL không?

Những gì tôi muốn đạt được là một cái gì đó như thế này (chúng ta có thể giả định rằng cả hai USERGROUP là duy nhất):

set @user = 123456;
set @group = select GROUP from USER where User = @user;
select * from USER where GROUP = @group;

Xin lưu ý rằng tôi biết điều đó là có thể nhưng tôi không muốn làm điều này với các truy vấn lồng nhau.

Câu trả lời:


330

Có, nhưng bạn cần di chuyển phép gán biến vào truy vấn:

SET @user := 123456;
SELECT @group := `group` FROM user WHERE user = @user;
SELECT * FROM user WHERE `group` = @group;

Trường hợp thử nghiệm:

CREATE TABLE user (`user` int, `group` int);
INSERT INTO user VALUES (123456, 5);
INSERT INTO user VALUES (111111, 5);

Kết quả:

SET @user := 123456;
SELECT @group := `group` FROM user WHERE user = @user;
SELECT * FROM user WHERE `group` = @group;

+--------+-------+
| user   | group |
+--------+-------+
| 123456 |     5 |
| 111111 |     5 |
+--------+-------+
2 rows in set (0.00 sec)

Lưu ý rằng SET, hoặc =, :=có thể được sử dụng làm toán tử gán. Tuy nhiên, bên trong các câu lệnh khác, toán tử gán phải :=và không phải ==được coi là toán tử so sánh trong các câu lệnh không SET.


CẬP NHẬT:

Hơn nữa để bình luận dưới đây, bạn cũng có thể làm như sau:

SET @user := 123456;
SELECT `group` FROM user LIMIT 1 INTO @group; 
SELECT * FROM user WHERE `group` = @group;

3
Btw, bạn có thể chặn đầu ra của câu lệnh đầu tiên (dưới dạng gán biến duy nhất của nó) và chỉ hiển thị đầu ra của truy vấn thứ hai?
Avada Kedavra

3
@Avada: Đã cập nhật câu trả lời của tôi bằng một phương án, không đưa ra kết quả cho phép gán biến.
Daniel Vassallo

1
@DanielVassallo, Cũng có select grop into @group from user limit 1.
Pacerier

@DanielVassallo cảm ơn bạn rất nhiều. Các thống kê "VÀO" là rất hữu ích. Tôi đã tìm kiếm thiết lập var mysql từ select mà không trả về select. CẢM ƠN!
Luis Antonio Pestana

68

Chỉ cần thêm dấu ngoặc đơn xung quanh truy vấn:

set @user = 123456;
set @group = (select GROUP from USER where User = @user);
select * from USER where GROUP = @group;

Kết quả này Subquery returns more than 1 rowđối với tôi
đếm thời gian

1
@timbroder Chỉ cần thêm GIỚI HẠN 1 vào truy vấn. Dù sao, tôi đề nghị một chỉnh sửa để sửa nó.
Youkko

11

Trước tiên chúng ta hãy xem làm thế nào chúng ta có thể định nghĩa một biến trong mysql

Để xác định một biến trong mysql, nó phải bắt đầu bằng '@' như @ {biến_name} và '{biến_name}' này, chúng ta có thể thay thế nó bằng tên biến.

Bây giờ, làm thế nào để gán một giá trị trong một biến trong mysql. Đối với điều này, chúng tôi có nhiều cách để làm điều đó

  1. Sử dụng từ khóa 'SET'.

Ví dụ: - mysql> SET @a = 1;

  1. Không sử dụng từ khóa 'SET' và sử dụng ': ='.

Ví dụ: - mysql> @a: = 1;

  1. Bằng cách sử dụng câu lệnh 'CHỌN'.

Ví dụ: - mysql chọn 1 vào @a;

Ở đây @a là biến do người dùng định nghĩa và 1 sẽ được gán trong @a.

Bây giờ làm thế nào để có được hoặc chọn giá trị của @ {biến_name}.

chúng ta có thể sử dụng câu lệnh chọn như

Thí dụ :-

mysql chọn @a;

nó sẽ hiển thị đầu ra và hiển thị giá trị của @a.

Bây giờ làm thế nào để gán một giá trị từ một bảng trong một biến.

Đối với điều này, chúng ta có thể sử dụng hai tuyên bố như: -

  1. @a: = (chọn emp_name từ nhân viên trong đó emp_id = 1);

  2. chọn emp_name vào @a từ nhân viên trong đó emp_id = 1;

Luôn luôn cẩn thận emp_name phải trả về một giá trị nếu không nó sẽ gây ra lỗi cho bạn trong câu lệnh loại này.

tham khảo điều này: - http://www.easysolutionweb.com/sql-pl-sql/how-to-assign-a-value-in-a-variable-in-mysql


7

Sử dụng theo cách này để kết quả sẽ không được hiển thị trong khi chạy thủ tục được lưu trữ.

Truy vấn:

SELECT a.strUserID FROM tblUsers a WHERE a.lngUserID = lngUserID LIMIT 1 INTO @strUserID;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.