Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Trợ giúp MySQL:Tối ưu hóa truy vấn cập nhật đặt xếp hạng theo thứ tự của cột khác

Đầu tiên, tôi sẽ thay đổi budget , costrank_score thành kiểu dữ liệu số nguyên hoặc số khác và thay vì

UPDATE table_name
SET rank_score = CONCAT(cost, budget) ;

Sau đó, bạn sẽ sử dụng:

UPDATE table_name
SET rank_score = cost * 1000 + budget * 1  ;

Sau đó sẽ dễ dàng hơn vì bạn sẽ không phải xử lý các hàm chuỗi và có một cái gì đó như:

SELECT * 
FROM table_name
WHERE (conditions...)
ORDER BY rank_score DESC

(Dấu ngoặc đơn:có một tham số (1000 ) đặt cao hơn cái kia (1 ) tương đương với việc đặt hàng cost, budget . Hãy thử điều này để kiểm tra:

SELECT * 
FROM table_name
ORDER BY cost DESC
       , budget DESC

Vì vậy, bạn cũng có thể giảm rank_score tất cả, trừ khi bạn dự định thực hiện các thử nghiệm với các giá trị thông số khác nhau.

Như những người khác đã chỉ ra, cách tốt nhất không phải là có một trường không lưu trữ dữ liệu mà là một phép tính. Đó là hủy bình thường hóa. Ngay lập tức, bạn giữ cho bảng được bình thường hóa và cho phép cơ sở dữ liệu thực hiện các phép tính bất cứ khi nào bạn cần:

SELECT id, budget, cost, 
       cost*1000 + budget*1 AS rank_score_calculated
FROM table_name
ORDER BY rank_score_calculated DESC

rank_score_calculated không được lưu trữ trong ví dụ trên. Bằng cách này, bạn sẽ không phải cập nhật trường được tính toán mỗi khi ngân sách hoặc chi phí được thay đổi hoặc một hàng mới được thêm vào bảng.

Chỉ có một nhược điểm. Nếu bảng thực sự lớn và bạn cần truy vấn đó (và tính toán) được thực hiện bởi rất nhiều người dùng và rất thường xuyên và bảng được cập nhật khá thường xuyên, thì nó có thể làm chậm cơ sở dữ liệu của bạn. Trong trường hợp đó, người ta nên bắt đầu suy nghĩ về việc thêm một trường như vậy.

Trường hợp khác là khi người ta cần một rank tuyệt đối trên tất cả các hàng của bảng, như nhu cầu của bạn. Vì MySQL không có hàm "cửa sổ", rất khó để viết một truy vấn như vậy bằng SQL thuần túy.)

Thứ hạng có thể được tính bằng cách sử dụng các biến MySQL

SELECT *
     , @rownum:[email protected]+1 AS rank_calculated
FROM table_name
   , (SELECT @rownum:=0) AS st
ORDER BY rank_score DESC

Và nếu bạn muốn đặt những giá trị đó vào rank , sử dụng:

UPDATE table_name
         JOIN
         ( SELECT id
                , @rownum:[email protected]+1 AS rank_calculated
           FROM table_name
              , (SELECT @rownum:=0) AS st
           ORDER BY rank_score DESC
         ) AS r
         ON r.id = table_name.id
SET table_name.rank = r.rank_calculated ;

Hai truy vấn trên không phải là SQL thuần túy. Bạn có thể kiểm tra tùy chọn để chuyển sang một hệ thống cơ sở dữ liệu khác hỗ trợ các chức năng cửa sổ, như Postgres, SQL-Server hoặc Oracle.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ứng dụng Windows phone 8.1 kết nối với cơ sở dữ liệu

  2. Hỗ trợ Mysql bốn byte ký tự tiếng Trung Quốc

  3. Xóa tất cả các hàng có dấu thời gian cũ hơn x ngày

  4. cách tạo menu động với menu phụ bằng php &mysql

  5. Tìm các hình ảnh tương tự trong PHP / MySQL (thuần túy)