由于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
有人可以帮我解决这个问题吗
答案 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