首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >模拟row_num的Mysql会话变量的值不会增加

模拟row_num的Mysql会话变量的值不会增加
EN

Stack Overflow用户
提问于 2018-06-10 07:51:55
回答 1查看 25关注 0票数 0

因为MySql不提供row_num功能,所以我尝试在查询中使用会话变量(@variable_name)来模拟它的功能

问题语句如下所示:给定一个表'product_view‘,该表具有列'productTitle’和‘category title’,从每个类别中选择标题与提供的字符串匹配的前2个产品,执行以下查询

代码语言:javascript
复制
SELECT
  @row_num := CASE
                WHEN @cat_name = categoryName THEN @row_num + 1
                ELSE 1
              END 
  AS num,
  @cat_name := categoryName AS categoryName,
  productTitle
FROM product_search
WHERE 
  cityId = 1 AND
  mainStatus= 'Active' AND
  stock_status = 'In Stock' AND
  prodQuantity != 0 AND 
  productTitle LIKE '%apple%'
ORDER BY categoryName, LOCATE('apple', productTitle), productTitle

这预计会给出category1的row_num值1,2和类别2的值1,2,依此类推(只要有与‘Apple’匹配的)。但是rownum值始终停留在1

在下面的小提琴上也有类似的东西

有人能帮我解决这个问题吗

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-10 08:04:12

在较新版本的MySQL中,您需要在子查询中执行order by

此外,不能在一个表达式中设置@cat_name,同时在另一个表达式中使用它。MySQL不保证SELECT中表达式的求值顺序。所以,你不知道赋值和比较哪个最先被计算。

我通常这样写:

代码语言:javascript
复制
SELECT (@rn := IF(@cat_name = categoryName, @rn + 1,
                  IF(@cat_name := categoryName, 1, 1)
                 )
       ) as num,
       categoryName, productTitle
FROM (SELECT ps.*
      FROM product_search ps
      WHERE cityId = 1 AND
            mainStatus= 'Active' AND
            stock_status = 'In Stock' AND
            prodQuantity <> 0 AND 
            productTitle LIKE '%apple%'
      ORDER BY categoryName, LOCATE('apple', productTitle), productTitle
     ) ps CROSS JOIN
     (SELECT @cat_name := '', @rn := 0) params
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50779478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档