2010-07-30 34 views
22

Xem xét một truy vấn tương tự như:Thêm lĩnh vực bí danh MySQL cùng

SELECT sum(EXPR) as total, 
     sum(EXPR) as total2, 
     sum(total+total2) as grandtotal 
FROM tablename 

này đến và nói tổng cột chưa biết trong danh sách lĩnh vực.

Có cách nào để tham chiếu các trường bí danh trong phép tính mà không cần đánh lại biểu thức tổng vì sum(EXPR) ở mỗi bên là rất dài.

+1

Tôi đã có một cơ hội để kiểm tra câu trả lời của tôi và đã phát hiện ra tôi đã sai. Do đó tôi đã xóa nó. Cảm ơn bạn đã chỉ ra sai lầm của tôi. –

Trả lời

23

Đây là thứ tự về cách mọi thứ được thực hiện trong một công cụ cơ sở dữ liệu. Lưu ý rằng đây là một cái nhìn ngữ nghĩa về cách mọi thứ được thực hiện, cơ sở dữ liệu có thể làm những thứ theo thứ tự khác, nhưng nó phải tạo ra kết quả như thể nó đã được thực hiện theo cách này.

  1. Đầu tiên FROM phần được đánh giá, nơi nào tôi nhận được dữ liệu từ
  2. Sau đó WHERE phần được đánh giá, trong đó hàng được chúng tôi quan tâm đến
  3. Sau đó, GROUP BY-phần được đánh giá, làm thế nào làm chúng tôi kết hợp các hàng kết quả
  4. Sau đó, phần HAVING được đánh giá, trong đó nhóm chúng ta quan tâm đến
  5. Sau đó ORDER BY-phần được đánh giá, mà để chúng ta muốn những hàng/nhóm
  6. Cuối cùng, CHỌN-phần được đánh giá, mà colu Chúng tôi quan tâm đến

Một số công cụ cơ sở dữ liệu cho phép bạn phá vỡ điều này, bằng cách saing "GROUP BY 2" để nhóm theo cột thứ 2 trong phần SELECT, nhưng nếu bạn tuân theo thứ tự trên, bạn nên biết ngay bây giờ rằng lý do mã của bạn không hoạt động là không có cột có tổng số tên hoặc tổng số2 (chưa).

Nói cách khác, bạn cần lặp lại hai biểu thức hoặc tìm cách khác để thực hiện.

gì bạn có thể làm là sử dụng một phụ truy vấn (cung cấp cho bạn đang ở trên một phiên bản MySQL hỗ trợ này):

SELECT total, total2, total+total2 as grandtotal 
FROM (
    SELECT sum(EXPR) as total, sum(EXPR) as total2 
    FROM tablename 
    ) x 

Striking ra phần còn lại theo nhận xét.

Tôi không biết nhiều về MySQL mặc dù vậy bạn có thể phải bí danh tiểu truy vấn:

... 

    FROM tablename 
    ) AS x 
     ^-+^ 
     | 
     +-- add this 

Một số công cụ cơ sở dữ liệu cũng không cho phép sử dụng từ khóa AS subqueries khi răng cưa, vì vậy nếu doesn trên 't làm việc, hãy thử này:

... 

    FROM tablename 
    ) x 
    ^
     | 
     +-- add this 

+2

+1 cho mức độ cực kỳ triệt để. Có, truy vấn con cần được đặt bí danh. – Fosco

6
SELECT total, total2, total + total2 as grandtotal from (
SELECT sum(EXPR) as total, 
     sum(EXPR) as total2, 
FROM tablename 
) x 
0
SELECT 
WITH Sums AS 
(
SELECT sum(EXPR) as total, 
     sum(EXPR) as total2 
FROM tablename 
) 
SELECT SUM(sums); 

cho người hâm mộ tsql ...

+0

T-SQL Trong MySQL? –

+0

MySQL không hỗ trợ mệnh đề WITH: http://stackoverflow.com/questions/1382573/how-do-you-use-the-with-clause-in-mysql –

+0

@Lasse V. Karlsen: Mệnh đề WITH là không cụ thể TSQL - Oracle hỗ trợ không đệ quy WITH kể từ 9i. –

4
SELECT @total1 := sum(EXPR), 
     @total2 := sum(EXPR), 
     @total1 + @total2 as grandtotal 
FROM tablename 
+2

KHÔNG !!! SAI RỒI!!! Sổ tay MySQL (xem phần 9.4) ** cụ thể ** nói rằng loại điều này là không chính xác, bởi vì thứ tự các hoạt động không được đảm bảo. Nói cách khác, '@ total1 + @ total2' có thể được tính cho một hàng cụ thể * trước *' @ total1: = sum (EXPR) 'được thực hiện cho hàng. Điều này là không may, bởi vì nó đôi khi sẽ thực sự giúp đỡ trong việc xây dựng các biểu thức lớn nếu nó đã làm việc! – Doin

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