0

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

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?

4

3 回答 3

0

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

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

例如

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

但是...我不愿向您推荐这种方法,因为我很难展开您的 SQL 语句。目前尚不清楚您想要返回什么结果集。如果该子查询返回多行,则该查询似乎应该引发异常。我只是没有看到任何明确或暗示的内容可以为您提供保证。

所需输出的示例将大大有助于获得一些有用的帮助。

于 2013-06-07T23:57:46.747 回答
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

可能很接近

于 2013-06-08T00:08:12.840 回答
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所以总是返回值 of。

于 2013-06-07T22:59:18.453 回答