Adding a rank value to my MySQL table

空扰寡人 提交于 2020-01-03 16:54:35

问题


I have a fixed table that will not change. I have over 80,000 rows.

CREATE TABLE `word_list_master` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `word` varchar(64) NOT NULL,
  `created` int(11) NOT NULL,
  `frequency` int(11) NOT NULL,
  `number_of_files` int(11) NOT NULL,
  `combined_frequency` bigint(24) NOT NULL,
  PRIMARY KEY (`id`)
)

I want to create a 7th column 'rank' that will determine the rank of the rows ordered by the combined_frequency column. I am doing this to reduce overhead when the database is live.

Can I do this via MySQL statement(s) or do I have to write a bunch of SELECT/INSERT statements in PHP (for example)? I have been doing most of the work so far in PHP but it is taking up to 24 hours to perform operations on the table.

I was looking at the RANK function but as my MySQL ability is only fair in capacity, I ran into problems.


回答1:


Normally I wouldn't consider "don't do this" to be a valid answer to such a question, but you're not going to help your situation by adding a new column. You already have a numeric column by which to order your data. Adding a second numeric column for this purpose is not only over-kill, it is bad design.

If it's taking "up to 24 hours" to do any operation on a table containing only 80,000 rows (which is not very many) then you need to add indexes to the columns being used to search/sort/join.




回答2:


This is how you add a rank field to your table:

 SET @rownum = 0; 

 SELECT *,  (@rownum := @rownum + 1) AS rank
 FROM word_list_master
 ORDER BY combined_frequency DESC;

Update: If you want to write queries against that rank field, you have to use the previous table as a derived table like so:

SET @rownum = 0; 
SELECT *
FROM
(
   SELECT *,  (@rownum := @rownum + 1) AS rank
   FROM word_list_master
   ORDER BY combined_frequency DESC;
) t
WHERE rank = 5

And if you want to paging your query like so:

SET @rownum = 0; 
SELECT *
FROM
(
   SELECT *,  (@rownum := @rownum + 1) AS rank
   FROM word_list_master
   ORDER BY combined_frequency DESC;
) t
WHERE rank BETWEEN ((@PageNum - 1) * @PageSize + 1)
AND (@PageNum * @PageSize)

Update:

Note that there is already a buit-in way to do this instead of this awful query which is the [LIMIT {[offset,] row_count }], which is the standard mysql-way to do this. Don't use the previous way if you just want to get a limited result set from your query.



来源:https://stackoverflow.com/questions/12675166/adding-a-rank-value-to-my-mysql-table

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!