因为MySql不提供row_num功能,所以我尝试在查询中使用会话变量(@variable_name)来模拟它的功能
问题语句如下所示:给定一个表'product_view‘,该表具有列'productTitle’和‘category title’,从每个类别中选择标题与提供的字符串匹配的前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
这预计会给出category1的row_num值1,2和类别2的值1,2,依此类推(只要有与‘Apple’匹配的)。但是rownum值始终停留在1
在下面的小提琴上也有类似的东西
有人能帮我解决这个问题吗
发布于 2018-06-10 08:04:12
在较新版本的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
https://stackoverflow.com/questions/50779478
复制相似问题