Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多次加入后在mysql中查找排名_Php_Mysql_Join - Fatal编程技术网

Php 多次加入后在mysql中查找排名

Php 多次加入后在mysql中查找排名,php,mysql,join,Php,Mysql,Join,我试图通过用户获得的总分来确定排名。我确实有这个疑问,但不知道如何继续 SELECT wp_grank.ID , wp_grank.competitor_ID , wp_grank.tournament_ID , wp_grank.academy_ID , wp_grank.division_ID, wp_competitor.first_name, wp_competitor.last_name, wp_competitor.global_ID, wp_divisions.gender, IF

我试图通过用户获得的总分来确定排名。我确实有这个疑问,但不知道如何继续

SELECT
wp_grank.ID ,
wp_grank.competitor_ID ,
wp_grank.tournament_ID ,
wp_grank.academy_ID ,
wp_grank.division_ID,
wp_competitor.first_name,
wp_competitor.last_name,
wp_competitor.global_ID,
wp_divisions.gender,
IF(wp_divisions.age_level IN ('Tiny Kids','Kids','Pre Teen','Teen'),CONCAT('(',wp_divisions.gender,')'),'') as filterGender,
wp_tournaments.`name` as tournament_name,
wp_divisions.name as dname,
CONCAT_WS(' >> ', wp_divisions.division_type, wp_divisions.experience_level, wp_divisions.age_level, wp_divisions.weight_class, wp_divisions.gender) as division,
wp_academies.`name` as academy ,
SUM(wp_grank.points) as totalPoints
FROM
`wp_grank`
LEFT JOIN
wp_competitor
ON
wp_grank.competitor_ID = wp_competitor.ID
LEFT JOIN
wp_tournaments
ON
wp_grank.tournament_ID = wp_tournaments.ID
LEFT JOIN
wp_academies
ON
wp_grank.academy_ID = wp_academies.ID
LEFT JOIN
wp_divisions
ON
wp_grank.division_ID = wp_divisions.ID
WHERE
wp_divisions.ID IN (2) AND
YEAR(wp_tournaments.tournament_date)=2015
Group BY
wp_competitor.ID
ORDER BY
SUM(wp_grank.points) DESC ,wp_competitor.`last_name` ASC

我猜您只是想在查询中添加一个排名列。如果是:

set @rank = 0

select (@rank := @rank + 1) as rank, 
       . . .
有时,变量不能很好地与group by配合使用,因此需要一个子查询:

select (@rank := @rank + 1) as rank, q.*
from (<your query here>) q cross join
     (select @rank := 0) params;

我猜您只是想在查询中添加一个排名列。如果是:

set @rank = 0

select (@rank := @rank + 1) as rank, 
       . . .
有时,变量不能很好地与group by配合使用,因此需要一个子查询:

select (@rank := @rank + 1) as rank, q.*
from (<your query here>) q cross join
     (select @rank := 0) params;
试试这个:

定义一个变量:

设置@row_number=0

然后将查询包装到:

select @row_number:=@row_number + 1) AS rank, [all the other columns here]
from ( [your nasty query here ] ) as myNastyNastyQuery;
只需确保您的订单是在令人讨厌的查询中完成的。哈哈

试试这个:

定义一个变量:

设置@row_number=0

然后将查询包装到:

select @row_number:=@row_number + 1) AS rank, [all the other columns here]
from ( [your nasty query here ] ) as myNastyNastyQuery;

只需确保您的订单是在令人讨厌的查询中完成的。哈哈

你可以试试这个:

SET
    @prev = 0,
    @curr = 0,
    @rank = 1,
    @i = 1;

SELECT
    @prev := @curr,
    @rank := IF(
        @prev = @curr,
        @rank,
        @rank + @i
    ) AS rank,
    IF(
        @prev != SUM(wp_grank.points),
        @i := 1,
        @i := @i + 1
    ) AS counter,
    wp_grank.ID,
    wp_grank.competitor_ID ,
    wp_grank.tournament_ID ,
    wp_grank.academy_ID ,
    wp_grank.division_ID,
    wp_competitor.first_name,
    wp_competitor.last_name,
    wp_competitor.global_ID,
    wp_divisions.gender,
    IF(
        wp_divisions.age_level IN ('Tiny Kids','Kids','Pre Teen','Teen'),
        CONCAT('(',wp_divisions.gender,')'),
        ''
    ) as filterGender,
    wp_tournaments.`name` as tournament_name,
    wp_divisions.name as dname,
    CONCAT_WS(
        ' >> ',
        wp_divisions.division_type,
        wp_divisions.experience_level,
        wp_divisions.age_level,
        wp_divisions.weight_class,
        wp_divisions.gender
    ) as division,
    wp_academies.`name` as academy,
    @curr := SUM(wp_grank.points) as `totalPoints`
FROM
    `wp_grank`
    LEFT JOIN wp_competitor ON wp_grank.competitor_ID = wp_competitor.ID
    LEFT JOIN wp_tournaments ON wp_grank.tournament_ID = wp_tournaments.ID
    LEFT JOIN wp_academies ON wp_grank.academy_ID = wp_academies.ID
    LEFT JOIN wp_divisions ON wp_grank.division_ID = wp_divisions.ID
WHERE
    wp_divisions.ID IN (2)
    AND YEAR(wp_tournaments.tournament_date)=2015
GROUP BY wp_competitor.ID
ORDER BY
    `totalPoints` DESC,
    wp_competitor.`last_name` ASC;  
注:

对于您需要的具有绑定记录的排名,我使用session变量来定义排名是基于上一个值增加还是保留。
干杯你可以试试这个:

SET
    @prev = 0,
    @curr = 0,
    @rank = 1,
    @i = 1;

SELECT
    @prev := @curr,
    @rank := IF(
        @prev = @curr,
        @rank,
        @rank + @i
    ) AS rank,
    IF(
        @prev != SUM(wp_grank.points),
        @i := 1,
        @i := @i + 1
    ) AS counter,
    wp_grank.ID,
    wp_grank.competitor_ID ,
    wp_grank.tournament_ID ,
    wp_grank.academy_ID ,
    wp_grank.division_ID,
    wp_competitor.first_name,
    wp_competitor.last_name,
    wp_competitor.global_ID,
    wp_divisions.gender,
    IF(
        wp_divisions.age_level IN ('Tiny Kids','Kids','Pre Teen','Teen'),
        CONCAT('(',wp_divisions.gender,')'),
        ''
    ) as filterGender,
    wp_tournaments.`name` as tournament_name,
    wp_divisions.name as dname,
    CONCAT_WS(
        ' >> ',
        wp_divisions.division_type,
        wp_divisions.experience_level,
        wp_divisions.age_level,
        wp_divisions.weight_class,
        wp_divisions.gender
    ) as division,
    wp_academies.`name` as academy,
    @curr := SUM(wp_grank.points) as `totalPoints`
FROM
    `wp_grank`
    LEFT JOIN wp_competitor ON wp_grank.competitor_ID = wp_competitor.ID
    LEFT JOIN wp_tournaments ON wp_grank.tournament_ID = wp_tournaments.ID
    LEFT JOIN wp_academies ON wp_grank.academy_ID = wp_academies.ID
    LEFT JOIN wp_divisions ON wp_grank.division_ID = wp_divisions.ID
WHERE
    wp_divisions.ID IN (2)
    AND YEAR(wp_tournaments.tournament_date)=2015
GROUP BY wp_competitor.ID
ORDER BY
    `totalPoints` DESC,
    wp_competitor.`last_name` ASC;  
注:

对于您需要的具有绑定记录的排名,我使用session变量来定义排名是基于上一个值增加还是保留。
Cheers

以上解决方案为我提供了像1 2 3这样的顺序排列,但如果两个用户的分数相同,那么它应该是1,2,2不幸的是,MySQL没有真正的排名或密集的排名函数。哈哈,阿维多斯抓住了我!上面的解决方案让我以串行顺序排列,如1、2、3,但如果两个用户的分数相同,那么它应该是1、2、2。不幸的是,MySQL没有真正的秩或稠密的秩函数。哈哈,阿维多斯抓住了我!你能发布当前代码的示例输出吗?以及您执行的输出。您可以发布当前代码的示例输出吗?以及执行的输出。SQL语法中有错误;检查与您的MySQL服务器版本对应的手册,以获得正确的语法,以便在第10行使用接近“:=1,@i:=@i+1作为计数器,wp_grank.ID,wp_grank.comp”,我们是否需要在开始时初始化值,因为所有的参数都为null.yeah可以将所有@variables设置为0,除了@curr,因为它将来自您的totalPoints专栏。由于某些原因,我的访问权限有限,无法访问,因此,我更新了脚本。抱歉,您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以获得正确的语法,以便在第10行使用接近“:=1,@i:=@i+1作为计数器,wp_grank.ID,wp_grank.comp”,我们是否需要在开始时初始化值,因为所有的参数都为null.yeah可以将所有@variables设置为0,除了@curr,因为它将来自您的totalPoints专栏。由于某些原因,我的访问权限有限,无法访问,因此,我更新了脚本。抱歉,伙计