Giá trị lớn nhất từ ​​hai trường trở lên


83

Tôi cần nhận giá trị lớn nhất từ ​​hai trường:

SELECT MAX(field1), MAX(field2)

Bây giờ, làm thế nào tôi có thể nhận được giá trị lớn nhất từ ​​hai thứ này?


7
GREATEST()đối với lớn nhất tương tự LEAST()đối với nhỏ nhất.
James Oravec

Câu trả lời:


167

Bạn có thể muốn sử dụng GREATEST()chức năng:

SELECT GREATEST(field1, field2);

Nếu bạn muốn nhận được giá trị tối đa tuyệt đối từ tất cả các hàng, thì bạn có thể sử dụng như sau:

SELECT GREATEST(MAX(field1), MAX(field2));

Ví dụ 1:

SELECT GREATEST(1, 2);
+----------------+
| GREATEST(1, 2) |
+----------------+
|              2 |
+----------------+
1 row in set (0.00 sec)

Ví dụ 2:

CREATE TABLE a (a int, b int);

INSERT INTO a VALUES (1, 1);
INSERT INTO a VALUES (2, 1);
INSERT INTO a VALUES (3, 1);
INSERT INTO a VALUES (1, 2);
INSERT INTO a VALUES (1, 4);

SELECT GREATEST(MAX(a), MAX(b)) FROM a;
+--------------------------+
| GREATEST(MAX(a), MAX(b)) |
+--------------------------+
|                        4 |
+--------------------------+
1 row in set (0.02 sec)

không biết tại sao, nhưng chỉ GREATEST(MAX(field1), MAX(field2))là hoạt động. Số sai khác được trả lại (không phải lớn nhất)
Qiao

1
@Qiao: Có, bạn sẽ cần SELECT GREATEST(MAX(field1), MAX(field2));nhận được mức tối đa tuyệt đối từ tất cả các hàng. Nếu bạn sử dụng, SELECT GREATEST(field1, field2);bạn sẽ nhận được tập hợp kết quả có giá trị tối đa giữa field1 và field2 cho mỗi hàng.
Daniel Vassallo

Đó là những gì tôi đang tìm kiếm tôi đã chắc chắn có một chức năng cho điều này, nhưng tôi không có đầu mối của tên, bây giờ nó làm cho cảm giác hoàn hảo :)
Emil Borconi

39

Trong trường hợp bạn đang chọn GREATEST () cho mỗi hàng

SELECT GREATEST(field1, field2)

Nó sẽ trả về NULL nếu một trong các trường là NULL. Bạn có thể sử dụng IFNULL để giải quyết vấn đề này

SELECT GREATEST(IFNULL(field1, 0), IFNULL(field2, 0))

Ừ, thật buồn khi bạn phải làm tất cả những thứ đó IFNULLngay cả khi bạn có hai chục trường để so sánh!
Ifedi Okonkwo

6
mysql> SELECT GREATEST(2,0);
        -> 2

Vì vậy, hãy thử:

mysql> SELECT GREATEST(MAX(field1), MAX(field2));

1
SELECT max( CASE
                WHEN field1 > field2 THEN field1
                ELSE field2
            END ) as biggestvalue 
FROM YourTable;

Giải pháp này không khả thi khi tôi có 100 cột.
Deepak

1
@Deepak, ok, nhưng một câu trả lời từ hơn 10 năm trước khi tôi không biết về lệnh gọi hàm "TUYỆT VỜI NHẤT" hay "ÍT NHẤT", nhưng bài đăng gốc đã hỏi về 2 cột và nếu bạn có một bảng có 100 cột trong nó có bối cảnh tương tự, thì bạn có một vấn đề nghiêm trọng về thiết kế cơ sở dữ liệu cần xem xét lại.
DRapp

Vâng đúng, cảm ơn đã làm rõ. Bây giờ nhận xét của bạn sẽ giúp những người khác về việc sử dụng khi nào.
Deepak

0

Sử dụng GREATEST / LEAST với MIN / MAX

GREATEST / LEAST : được sử dụng với các cột, khi bạn muốn tìm giá trị tối đa hoặc tối thiểu từ các cột khác nhau.

MIN / MAX : được sử dụng với các hàng, khi bạn muốn tìm giá trị tối đa hoặc tối thiểu từ các hàng khác nhau:

Bảng ví dụ:

nhập mô tả hình ảnh ở đây

SELECT GREATEST(col_a, col_b, col_c) FROM temp;

nhập mô tả hình ảnh ở đây

SELECT MIN(GREATEST(col_a, col_b, col_c)) FROM temp; # 3 as output
SELECT MAX(GREATEST(col_a, col_b, col_c)) FROM temp; # 9 as output


SELECT LEAST(col_a, col_b, col_c) FROM temp;

nhập mô tả hình ảnh ở đây

SELECT MIN(LEAST(col_a, col_b, col_c)) FROM temp; # 1 as output
SELECT MAX(LEAST(col_a, col_b, col_c)) FROM temp; # 7 as output
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.