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

时间:2018-06-09 23:51:55

标签: mysql sql

由于MySql不提供row_num工具,我试图在查询中使用会话变量(@variable_name)模拟其功能

问题陈述如下 给定一个包含'productTitle'和'categoryName'列的'product_view'表, 从标题与提供的字符串匹配的每个类别中选择前2个产品 通过以下查询

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

预计这会给class1的row_num值1,2和类别2的1,2,依此类推(只要它们匹配'Apple')。 但是rownum值总是停留在1

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

有人可以帮我解决这个问题吗

1 个答案:

答案 0 :(得分:0)

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

此外,您不能在一个表达式中设置@cat_name并在另一个表达式中使用它。 MySQL不保证SELECT中表达式的评估顺序。因此,您不知道首先评估哪个,分配或比较。

我通常把它写成:

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