2011-07-07 53 views
27

Tôi có một bảng với các cột: (đây chỉ là một ví dụ tôi có 50K hồ sơ)cột cập nhật với một mysql số thứ tự

Name, Number 

Joe  Null 
Michael Null 
Moses Null 

tôi để cập nhật các số với số thứ tự từ 1-3 để nó sẽ giống như thế này:

Name, Number 

Joe  1 
Michael 2 
Moses 3 

làm thế nào tôi có thể làm điều đó trong SQL cho Mysql trong lệnh SQL một

+1

Thứ tự được cho là dựa trên điều gì? Theo thứ tự chữ cái? – JNK

+0

Không quan trọng. Tôi cần phải có số tất cả các số từ 1-3 (1-size) – Dejell

Trả lời

73
SET @rank:=0; 
update T 
set [email protected]:[email protected]+1; 

CẬP NHẬT

cách khác với một tuyên bố

UPDATE T 
JOIN (SELECT @rank := 0) r 
SET [email protected]:[email protected]+1; 
+9

btw, bạn có thể thêm 'ORDER BY NAME' vào bản cập nhật đó nếu được yêu cầu :) – Bohemian

+0

Khi tôi chạy trên truy vấn, tôi nhận được dữ liệu bị cắt bớt cho cột. .. lỗi –

+0

@LearnNhiều loại dữ liệu nào của cột đó? – triclosan

1

Bạn có thể thử thiết lập Number để AUTO_INCREMENT nên những con số sẽ được tạo:

ALTER TABLE your_table MODIFY Number INT AUTO_INCREMENT 

Khác hơn thế, có thể bạn cần: a) các thói quen được lưu trữ b) mã ứng dụng

2

Tôi đấu tranh để tìm câu trả lời trực tuyến và thấy phương pháp sau đây có hiệu quả đối với tôi, dựa trên một số thông tin ở trên nhưng với cách tiếp cận cập nhật khác. Đăng ở đây trong trường hợp nó cũng giúp người khác.

Lưu ý: đối với tập dữ liệu của tôi, xếp hạng là phép tính cố định một lần, nó sẽ không thay đổi. Tôi muốn thêm nó như là một cột để tiết kiệm chạy một tính toán mỗi khi tôi kéo dữ liệu từ MySQL vào Python.

Giải pháp tôi đã sử dụng:

  • bộ cấp bậc 0 (như trên)
  • tạo ra một bảng tạm thời chứa các truy vấn chọn để tính toán thứ hạng
  • cập nhật bảng ban đầu với các cấp bậc tính.

tên mẫu sử dụng, rowid là định danh duy nhất cho mỗi hàng, giá trị là số liệu sẽ được sử dụng để xác định thứ hạng cho mỗi hàng

SET @rank=0; 
CREATE TEMPORARY TABLE rank_temp 
AS 
(SELECT rowid, value, @rank:[email protected]+1 AS rank FROM source_table ORDER BY value ASC); 

UPDATE sourcetable a, rank_temp b 
SET a.rank = b.rank 
WHERE a.rowid = b.rowid; 

Đó là một phương pháp thô nhưng đã làm việc trên tôi tập dữ liệu.

+1

đôi khi đá quý có thể được tìm thấy mã nội bộ thô, rất hữu ích trong trường hợp của tôi, nỗ lực tuyệt vời thực sự –

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