Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/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 在这种情况下,使用子查询可能会更快。然后可以将LIMIT子句与ORDER BY一起放入子查询中,因此只需要使用变量将秩添加到10行_Php_Mysql_Select - Fatal编程技术网

Php 在这种情况下,使用子查询可能会更快。然后可以将LIMIT子句与ORDER BY一起放入子查询中,因此只需要使用变量将秩添加到10行

Php 在这种情况下,使用子查询可能会更快。然后可以将LIMIT子句与ORDER BY一起放入子查询中,因此只需要使用变量将秩添加到10行,php,mysql,select,Php,Mysql,Select,我不确定如何将其与单个用户的查询结合起来,主要是因为我不确定您希望如何将这两个结果合并在一起。好的,我的评论中的示例。您所拥有的东西通常会起作用,但是在应用排名之前,没有什么可以强迫MySQL进行排序 SELECT b.uid, COUNT(a.uid) FROM users_ranking a LEFT OUTER JOIN users_ranking b ON WEEKOFYEAR(a.`date`) = WEEKOFYEAR(b.`date`) AND a.votes >= b.

我不确定如何将其与单个用户的查询结合起来,主要是因为我不确定您希望如何将这两个结果合并在一起。

好的,我的评论中的示例。您所拥有的东西通常会起作用,但是在应用排名之前,没有什么可以强迫MySQL进行排序

SELECT b.uid, COUNT(a.uid) 
FROM users_ranking a
LEFT OUTER JOIN users_ranking b
ON WEEKOFYEAR(a.`date`) = WEEKOFYEAR(b.`date`) 
AND a.votes >= b.votes
GROUP BY b.uid
HAVING b.uid = '".$_SESSION['uid']."' 
因此,使用额外级别的子查询将提供此功能(未测试)。内部子查询以正确的顺序获取相关周的所有用户ID,而下一个外部子查询将排名应用于此有序结果集。外部查询只获取所需的单个返回行

SELECT c.rank, c.uid
FROM
(
    SELECT @ranking:= @ranking + 1 rank, a.uid
    FROM 
    (
        SELECT uid, votes
        FROM    `users_ranking`
        WHERE WEEKOFYEAR(`date`) = WEEKOFYEAR(NOW()) 
        ORDER BY votes DESC
    ) a,
    (SELECT @ranking := 0) b
) c
WHERE c.uid = '".$_SESSION['uid']."' 
LIMIT 1
另一种避免子查询和避免使用变量的可能性是执行联接。这是(mis)使用必须将结果缩小到您感兴趣的单行。这种解决方案的缺点是,如果多个用户拥有相同的分数,他们每个人都会获得相同的排名

SELECT b.uid, COUNT(a.uid) 
FROM users_ranking a
LEFT OUTER JOIN users_ranking b
ON WEEKOFYEAR(a.`date`) = WEEKOFYEAR(b.`date`) 
AND a.votes >= b.votes
GROUP BY b.uid
HAVING b.uid = '".$_SESSION['uid']."' 
编辑

要获得前10名排名,请执行以下操作:-

SELECT b.uid, COUNT(a.uid) AS rank
FROM users_ranking a
LEFT OUTER JOIN users_ranking b
ON WEEKOFYEAR(a.`date`) = WEEKOFYEAR(b.`date`) 
AND a.votes >= b.votes
GROUP BY b.uid
ORDER BY rank
LIMIT 10
尽管在这种情况下,使用子查询可能会更快。然后可以将LIMIT子句与ORDER BY一起放入子查询中,因此只需要使用变量将秩添加到10行



我不知道如何将其与单个用户的查询结合起来,主要是因为我不确定您想如何将这两个结果合并在一起。

检查此答案:检查此答案的可能重复:检查此答案的可能重复:检查此答案的可能重复:严格来说,我认为您应该按顺序(从子查询)从用户处获取记录然后再加上排名。这将迫使MySQL在计算排名前按顺序获得投票。你能举个例子吗@从严格意义上说,我认为您应该按顺序(从子查询)从用户那里获取排名记录,然后将排名添加到其中。这将迫使MySQL在计算排名前按顺序获得投票。你能举个例子吗@从严格意义上说,我认为您应该按顺序(从子查询)从用户那里获取排名记录,然后将排名添加到其中。这将迫使MySQL在计算排名前按顺序获得投票。你能举个例子吗@从严格意义上说,我认为您应该按顺序(从子查询)从用户那里获取排名记录,然后将排名添加到其中。这将迫使MySQL在计算排名前按顺序获得投票。你能举个例子吗@谢谢你的详细答复。但是,在我在这里标记一个正确的解决方案之前,你能再解释一下你的解决方案吗?这是关于性能问题吗?我的MySQL语句到底有什么不同之处?此外,在我验证我的系统中不允许存在两个拥有相同票数的用户。第一个解决方案在添加排名之前强制执行顺序。这是对您自己拥有的解决方案的简单升级。此解决方案(以及您的)的缺点是,它使用子查询,而这些子查询的性能往往很差(因为MySQL通常不会从子查询中携带索引),此外,它还强制内部查询返回应用了排名的所有记录。我的第二个解决方案避免了子查询,应该使用索引(使用内部联接可能比使用左外部联接更有效)。我不熟悉子查询,所以直到现在我才知道性能差。我现在在很多网站上都看到了。所以我想使用join解决方案。但有一个问题是,您的第二个解决方案被分配给特定的用户。在select语句上方,我列出了所有用户的前10名。因此有两个问题。他们是否可以以某种方式缩短为一个查询,以获得前10名列表以及该特定登录用户?这是我的代码:为此添加了一个建议,但不确定是否将这两个查询合并在一起。谢谢您的详细回复。但是,在我在这里标记一个正确的解决方案之前,你能再解释一下你的解决方案吗?这是关于性能问题吗?我的MySQL语句到底有什么不同之处?此外,在我验证我的系统中不允许存在两个拥有相同票数的用户。第一个解决方案在添加排名之前强制执行顺序。这是对您自己拥有的解决方案的简单升级。此解决方案(以及您的)的缺点是,它使用子查询,而这些子查询的性能往往很差(因为MySQL通常不会从子查询中携带索引),此外,它还强制内部查询返回应用了排名的所有记录。我的第二个解决方案避免了子查询,应该使用索引(使用内部联接可能比使用左外部联接更有效)。我不熟悉子查询,所以直到现在我才知道性能差。我现在在很多网站上都看到了。所以我想使用join解决方案。但有一个问题是,您的第二个解决方案被分配给特定的用户。在select语句上方,我列出了所有用户的前10名。因此有两个问题。他们是否可以以某种方式缩短为一个查询,以获得前10名列表以及该特定登录用户?这是我的代码:为此添加了一个建议,但不确定是否将这两个查询合并在一起。谢谢您的详细回复。但是,在我在这里标记一个正确的解决方案之前,你能再解释一下你的解决方案吗?这是关于性能问题吗?我的MySQL语句到底有什么不同之处?此外,在我验证我的系统中不允许存在两个拥有相同票数的用户。第一个解决方案在添加排名之前强制执行顺序。这是对您拥有的解决方案的简单升级
SELECT b.uid, COUNT(a.uid) AS rank
FROM users_ranking a
LEFT OUTER JOIN users_ranking b
ON WEEKOFYEAR(a.`date`) = WEEKOFYEAR(b.`date`) 
AND a.votes >= b.votes
GROUP BY b.uid
ORDER BY rank
LIMIT 10