Heim >Datenbank >MySQL-Tutorial >MySQL存储过程获取记录排名(一般用于投票系统)

MySQL存储过程获取记录排名(一般用于投票系统)

WBOY
WBOYOriginal
2016-06-07 14:57:341129Durchsuche

MySQL存储过程获取记录排名(一般用于投票系统) 原理 计算当前学校的票数,暂且记作a 计算票数大于自己的学校数目,暂且记作b,如果b=0,则自己票数排名第一 计算票数小于自己的学校数目,暂且记作c,如果c=0,则自己票数排名最后 如果b!=0c!=0,那么b+c就是

MySQL存储过程获取记录排名(一般用于投票系统)
原理
计算当前学校的票数,暂且记作a
计算票数大于自己的学校数目,暂且记作b,如果b=0,则自己票数排名第一
计算票数小于自己的学校数目,暂且记作c,如果c=0,则自己票数排名最后
如果b != 0 && c != 0,那么b+c就是自己的票数排名
CREATE PROCEDURE `get_rank`(IN `school` INT)
BEGIN
SET @votes = (SELECT COUNT(tcl_vote.vote_id) AS counts FROM tcl_works LEFT JOIN tcl_vote ON tcl_vote.works_id = tcl_works.works_id WHERE tcl_works.school_id=school);
SET @gt = (
SELECT
COUNT(*)
FROM
(
SELECT
tcl_works.school_id,
COUNT(tcl_vote.vote_id) AS votes
FROM
tcl_works
LEFT JOIN tcl_vote ON tcl_vote.works_id = tcl_works.works_id
GROUP BY
tcl_works.school_id
HAVING
votes > @votes
ORDER BY
votes DESC
)
AS xxx
);
IF @gt = 0
THEN
SET @rank = 1;
SELECT @rank AS rank;
ELSE
SET @lt = (
SELECT
COUNT(*)
FROM
(
SELECT
tcl_works.school_id,
COUNT(tcl_vote.vote_id) AS votes
FROM
tcl_works
LEFT JOIN tcl_vote ON tcl_vote.works_id = tcl_works.works_id
GROUP BY
tcl_works.school_id
HAVING
votes < @votes
ORDER BY
votes DESC
)
AS xxx
);
IF @lt = 0
THEN
SET @rank =(SELECT COUNT(*) FROM tcl_school LIMIT 1);
SELECT @rank AS rank;
ELSE
SET @rank = (@gt+@lt);
SELECT @rank AS rank;
END IF;
END IF;
END;

call get_rank(1)
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn