2011-12-30 42 views
5

Tôi có truy vấn MySQL chạy một thao tác ngắn (tổng số đếm trong câu lệnh chọn) và tôi muốn sử dụng kết quả để thực hiện phép toán, nhưng tôi gặp lỗi.Sử dụng MySQL tạo cột trong truy vấn chọn

Bảng:

id | group | count | 
----------------------------- 
1  1   3 
2  1   2 

Query:

select id, count, 
    (select sum(count) from table group by group) as total, 
    count/total as percent 
from table 

Lỗi này là vì không có thực "tổng" cột trong bảng. Tôi làm cách nào để truy vấn hoạt động?

+1

Bạn sẽ không đưa ra bất kỳ thông báo lỗi. – hakre

+1

Xin lỗi về điều đó! Tôi nghĩ rằng tôi đã mô tả nó với đoạn cuối, nhưng chính thức lỗi là 'ERROR 1054 (42S22): Cột không xác định 'tổng' trong 'danh sách trường' ' – MechEngineer

Trả lời

18

Bạn có thể lưu total làm variable, sau đó sử dụng tính năng đó trong phép tính phân chia.

SELECT 
    `id`, `count`, 
    @total:=(SELECT sum(`count`) FROM `table` GROUP BY `group`) AS `total`, 
    `count`/@total AS `percent` 
FROM `table` 

LƯU Ý: GROUPreserved word trong MySQL. Bạn nên kèm theo (và tất cả các tên trường/bảng khác) trong các dấu sau (`).

+0

BOOM, chúng tôi có một người chiến thắng! Cảm ơn, Rocket. – MechEngineer

+0

@MechEngineer: Bạn được chào đón. Vui vì tôi có thể giúp :-) –

+3

Tài liệu MySQL cảnh báo chống lại việc này. "Là quy tắc chung, ngoài các câu lệnh SET, bạn không bao giờ gán giá trị cho biến người dùng và đọc giá trị trong cùng một câu lệnh .... bạn có thể nhận được kết quả mong đợi, nhưng điều này không được đảm bảo". Xem http://dev.mysql.com/doc/refman/5.7/en/user-variables.html – PaulC

0

group là một từ dành riêng trong mysql, như là table, bạn nên sử dụng nó như:

select id, count, (select sum(count) from `table` group by `group`) as total, count/total as percent from `table` 

Để biết thêm thông tin: MySQL Reserved Words

Bạn sẽ thấy đó mà bạn thực sự có thể sử dụng count nhưng Tôi sẽ đặt tất cả các tên bảng và cột trong dấu ngoặc kép.

0

Vấn đề của bạn là truy vấn bên trong cần tạo 1 kết quả mỗi hàng, không phải 1 cho mỗi nhóm. Bạn muốn thêm một mệnh đề where trong truy vấn bên trong nói cái gì đó như

where inner_table.group = outer_table.group

để chỉ một kết quả được trả về.

2

Bạn cũng có thể làm điều này mà không cần giới thiệu một biến:

select id, 
    count, 
    (select sum(count) from `table` group by `group`) as total, 
    (select count/total) as percent 
from `table`; 

Tạo:

+------+-------+-------+---------+ 
| id | count | total | percent | 
+------+-------+-------+---------+ 
| 1 |  3 |  5 | 0.6000 | 
| 2 |  2 |  5 | 0.4000 | 
+------+-------+-------+---------+ 
2 rows in set (0.05 sec) 
Các vấn đề liên quan