我正在运行以下查询,以便根据喜欢的总数获得所有类别的商家排名。
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以用于下一行?
答案 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_NUMBER,RANK或DENSE_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
可能很接近