2010-10-21 6 views
15

Tôi muốn biết nếu có một cách để sử dụng một biến người dùng định nghĩa trong WHERE khoản, như trong ví dụ này:MySQL biến người dùng định nghĩa trong mệnh đề WHERE

SELECT id, location, @id := 10 FROM songs WHERE id = @id 

truy vấn này chạy không có lỗi nhưng không hoạt động như mong đợi.

+0

Bạn đang mong đợi truy vấn để làm gì? –

+0

Trong kịch bản thực, tôi muốn xác định một biến để có được LOCATE() offset của một chuỗi con trong một trường. Tôi sử dụng nó nhiều lần trong câu lệnh SELECT. Vấn đề là tôi muốn chỉ hiển thị kết quả có độ lệch lớn hơn 0. Tôi biết rằng tôi có thể sử dụng một LOCATE() trong mệnh đề WHERE, nhưng tại sao biến này không hoạt động trong mệnh đề WHERE? –

Trả lời

16

Không xa so với những gì Mike E. đề xuất, nhưng một tuyên bố:

SELECT id, location FROM songs, (SELECT @id := 10) AS var WHERE id = @id; 

tôi đã sử dụng các truy vấn tương tự như thi đua chức năng cửa sổ trong MySQL. Ví dụ. Row sampling - chỉ là một ví dụ về sử dụng các biến trong cùng một tuyên bố

+0

Truy vấn phụ trong mệnh đề FROM ... một mẹo hữu ích! Cảm ơn bạn! :) –

3

Chắc chắn, nhưng tôi chưa bao giờ thấy bất kỳ ai cố gắng đặt biến và sử dụng biến đó trong cùng một câu như bạn. Hãy thử:

SET @id := 10; 
SELECT @id := 10 FROM songs WHERE id = @id; 

hoặc

SELECT @id := 10 FROM songs; 
SELECT @id := 10 FROM songs WHERE id = @id; 

Tôi đã sử dụng cả hai, và cả hai đều có vẻ làm việc cho tôi.

+0

điều này dường như không hoạt động ...!? – Raffael

10

Từ trang hướng dẫn MySQL trên User Defined Variables:

Theo nguyên tắc chung, bạn không bao giờ nên gán giá trị cho một biến người dùng và đọc giá trị trong vòng cùng một tuyên bố. Bạn có thể nhận được kết quả mong đợi, nhưng điều này không được đảm bảo.

Vì vậy, bạn nên tách các phân từ báo cáo kết quả chọn:

SET @id = 10; 
SELECT id, location, @id FROM songs WHERE id = @id; 
0

này đã làm việc cho tôi!

SET @identifier = 7; 
SELECT * FROM test where identifier = @identifier;