2011-08-24 30 views
5

Chỉnh sửa: thu hẹp sự cố xuống. đây là một ví dụ đơn giản:Cách sử dụng @variable với các hàm tối thiểu/tối đa?

mysql> select * from table_a; 
+-------+ 
| col_a | 
+-------+ 
|  1 | 
|  2 | 
|  3 | 
|  4 | 
+-------+ 
4 rows in set (0.00 sec) 

mysql> select @a:=max(col_a),@a from table_a; 
+----------------+------+ 
| @a:=max(col_a) | @a | 
+----------------+------+ 
|    4 | NULL | 
+----------------+------+ 
1 row in set (0.00 sec) 

Tại sao @aNULL, và làm thế nào tôi có thể lấy nó để không được?

+1

Tôi đã phạm một sai lầm ngu xuẩn khi kiểm tra điều bí danh đã cho tôi kết quả dương tính giả, đã xóa câu trả lời. – nobody

Trả lời

5

MySql manual là khá rõ ràng về vấn đề này, quote:

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 báo cáo kết quả tương tự. Bạn có thể nhận được kết quả mong đợi, nhưng điều này không được đảm bảo. Thứ tự đánh giá cho các biểu thức liên quan đến biến người dùng là không xác định và có thể thay đổi dựa trên các phần tử chứa trong một câu lệnh đã cho; Ngoài ra, thứ tự này không được đảm bảo giống nhau giữa các bản phát hành của Máy chủ MySQL. Trong SELECT @a, @a: = @ a + 1, ..., bạn có thể nghĩ rằng MySQL sẽ đánh giá @a trước và sau đó thực hiện nhiệm vụ thứ hai. Tuy nhiên, việc thay đổi câu lệnh (ví dụ, bằng cách thêm mệnh đề GROUP BY, HAVING hoặc ORDER BY) có thể khiến MySQL chọn một kế hoạch thực hiện với một thứ tự đánh giá khác.

1

sẽ không phải mọi cột trả lại theo hàm tổng hợp có thể được sử dụng cho hầu hết các trường hợp?

nói cách khác, là khó có thể đoán những gì bạn đang thực sự tìm kiếm
(dun tâm để cập nhật câu hỏi của bạn một lần nữa?)

việc sử dụng bình thường

select max(col_a) as anything 
from table_a 
order by anything; 

i dun thấy bất kỳ tác hại nào đối với điều này hoặc là

select max(col_a) as anything, max(col_a) as anything2, 
from table_a 
order by anything, anything2; 

nếu bạn thử ing để sử dụng chức năng tổng hợp cho LIMIT,
này là không khả thi

người dùng định nghĩa biến từ chọn là không đáng tin cậy (Tôi sử dụng là một fan hâm mộ)

http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

Là một quy tắc chung, bạn không bao giờ nên gán giá trị cho biến người dùng và đọc giá trị trong 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. Thứ tự đánh giá cho các biểu thức liên quan đến biến người dùng là không xác định và có thể thay đổi dựa trên các phần tử chứa trong một câu lệnh đã cho; Ngoài ra, thứ tự này không được đảm bảo giống nhau giữa các bản phát hành của Máy chủ MySQL. Trong SELECT @a, @a: = @ a + 1, ..., bạn có thể nghĩ rằng MySQL sẽ đánh giá @a trước và sau đó thực hiện nhiệm vụ thứ hai. Tuy nhiên, việc thay đổi câu lệnh (ví dụ, bằng cách thêm mệnh đề GROUP BY, HAVING hoặc ORDER BY) có thể khiến MySQL chọn một kế hoạch thực hiện với một thứ tự đánh giá khác.

+0

huh ..? bạn có thể giải thích thêm một chút không? 'stamp_date' là' INT' lưu trữ dấu thời gian unix. Tôi muốn đặt 'MIN (stamp_date)' vào một biến vì tôi cần sử dụng lại nhiều lần trong truy vấn của mình.Truy vấn của bạn thậm chí không tham chiếu đến 'MIN (stamp_date)'. Oh ....... bạn đang lo hết tem_date đầu tiên sẽ là min, phải không? Tại sao nó lại hoạt động, nhưng 'min' thì không? – mpen

+0

Ok, bạn đang 'nhiễu' substring_index' thực sự lấy cùng một giá trị 'MIN' đã làm, nhưng tôi không thấy cách này giải quyết bất cứ điều gì. Tôi vẫn không thể ném nó vào một biến và tái sử dụng nó. – mpen

+0

khi bạn có giá trị start_time, bạn có thể sử dụng start_time để sắp xếp – ajreal

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