每行后MySQL重置变量

时间:2013-06-07 22:45:38

标签: mysql

我正在运行以下查询,以便根据喜欢的总数获得所有类别的商家排名。

SET @rownum = 0;
    SELECT b.*
    , (
    SELECT f4.rank from business as b2 INNER JOIN (
    select count(*) count,  @rownum:=@rownum + 1 as rank, f3.* from favourites as f3 GROUP BY f3.business_id ORDER BY count DESC ) as f4 ON b2.id = f4.business_id WHERE b2.id = 8 && f4.category_id=c.id
    )  
    as rank FROM business as b, category c where b.id=8
在第一行之后

rank给出NULL,我该怎么做才能将@rownum重置为0以用于下一行?

3 个答案:

答案 0 :(得分:0)

在我看来,你的代码应该为结果中的每一行增加@rownum,因为第一个子查询以及连接的子查询应该为每一行执行一次。

在我看来,您的查询等同于以下内容:

 SELECT b.*, @rownum:=@rownum + 1 AS rank
 FROM business AS b, category c 
 WHERE b.id=8

编辑:如果问题是你需要在子查询中重置@rownum但是你只限于结果中的一个列,请使用类似这样的结构:

SELECT IF(@rownum:=0, NULL, f4.rank) AS rank FROM ...

始终评估条件@rownum:=0,重置rownum,并且因为它的计算结果为0,所以始终返回f4.rank的值。

答案 1 :(得分:0)

要重置@rownum用户变量,您可以尝试在FROM子句中包含内联视图(即派生表)。

看起来你需要在内部相关子查询中。相关子查询应该从category c的每一行重新执行,或者至少每个c.id的不同值都重新执行。 (我将假设每个表中的id列是主键。)

e.g。

    FROM ...
    JOIN (SELECT @rownum := 0) r
   WHERE ...

但是......我对你推荐这种方法犹豫不决,因为我很难解开你的SQL语句。它不清楚你想要返回什么结果集。如果该子查询返回多行,则该查询应该抛出异常。我只是没有看到任何明示或暗示会给你保证的东西。

所需输出的一个例子将有很长的路要走,以获得一些有用的帮助。

答案 2 :(得分:0)

我很确定您希望ROW_NUMBERRANKDENSE_RANK按business_ID分区,但我无法穿透您的SQL

一些输入&输出会有所帮助。

select * from
business as f4 inner join
(
select business_id, count(*),rank() over (partition by business_id order by count desc ) as rank) as counts
on f4.business_id=counts.business_id

可能很接近