是否有一种解决方案可以在 select 语句中对列名使用变量过滤器而不将其与查询连接?
不工作
BEGIN
Declare StartRow int;
set StartRow = ((PageNumber - 1) * PageSize);
SELECT
t.qid,
t.title,
t.vote,
t.answer_count,
t.creation_date,
t.uid,
t.username,
MAX(CASE WHEN t.constantTagNumber = 1 THEN t.tag END) AS tag1,
MAX(CASE WHEN t.constantTagNumber = 1 THEN t.tid END) AS tid1,
MAX(CASE WHEN t.constantTagNumber = 2 THEN t.tag END) AS tag2,
MAX(CASE WHEN t.constantTagNumber = 2 THEN t.tid END) AS tid2,
MAX(CASE WHEN t.constantTagNumber = 3 THEN t.tag END) AS tag3,
MAX(CASE WHEN t.constantTagNumber = 3 THEN t.tid END) AS tid3,
MAX(CASE WHEN t.constantTagNumber = 4 THEN t.tag END) AS tag4,
MAX(CASE WHEN t.constantTagNumber = 4 THEN t.tid END) AS tid4,
MAX(CASE WHEN t.constantTagNumber = 5 THEN t.tag END) AS tag5,
MAX(CASE WHEN t.constantTagNumber = 5 THEN t.tid END) AS tid5
FROM
(
SELECT
questions.id as qid,
title,
creation_date,
vote,
answer_count,
tags.id as tid,
tag,
username,
users.id as uid,
IF (@prev = qid ,@c := @c + 1,@c := 1) constantTagNumber,
@prev := qid
FROM ( SELECT @prev := 0 ,@c := 1) var,question_tags
INNER JOIN tags ON question_tags.tid = tags.id
RIGHT JOIN questions ON question_tags.qid = questions.id
INNER JOIN users ON users.id=owner_id
ORDER BY qid,tid
) t
GROUP BY t.qid ORDER BY filter desc LIMIT StartRow,PageSize;
END
The problem is only with the last
order by filter
herefilter
is avarchar
variable that I am using as a parameter.
由于过滤器是一个变量,因此上面的代码不起作用。
任何人都可以建议一个简单的解决方案以使其发挥作用。
Make It work means ,I need to use the column name to use as order by from parameter.
更新
BEGIN
Declare StartRow int;
set StartRow = ((PageNumber - 1) * PageSize);
set @sql1=(
SELECT
t.qid,
t.title,
t.vote,
t.answer_count,
t.creation_date,
t.uid,
t.username,
MAX(CASE WHEN t.constantTagNumber = 1 THEN t.tag END) AS tag1,
MAX(CASE WHEN t.constantTagNumber = 1 THEN t.tid END) AS tid1,
MAX(CASE WHEN t.constantTagNumber = 2 THEN t.tag END) AS tag2,
MAX(CASE WHEN t.constantTagNumber = 2 THEN t.tid END) AS tid2,
MAX(CASE WHEN t.constantTagNumber = 3 THEN t.tag END) AS tag3,
MAX(CASE WHEN t.constantTagNumber = 3 THEN t.tid END) AS tid3,
MAX(CASE WHEN t.constantTagNumber = 4 THEN t.tag END) AS tag4,
MAX(CASE WHEN t.constantTagNumber = 4 THEN t.tid END) AS tid4,
MAX(CASE WHEN t.constantTagNumber = 5 THEN t.tag END) AS tag5,
MAX(CASE WHEN t.constantTagNumber = 5 THEN t.tid END) AS tid5
FROM
(
SELECT
questions.id as qid,
title,
creation_date,
vote,
answer_count,
tags.id as tid,
tag,
username,
users.id as uid,
IF (@prev = qid ,@c := @c + 1,@c := 1) constantTagNumber,
@prev := qid
FROM ( SELECT @prev := 0 ,@c := 1) var,question_tags
INNER JOIN tags ON question_tags.tid = tags.id
RIGHT JOIN questions ON question_tags.qid = questions.id
INNER JOIN users ON users.id=owner_id
ORDER BY qid,tid
) t
GROUP BY t.qid);
set @sql=CONCAT(@sql1," ORDER BY ",filter," desc LIMIT", StartRow,",",PageSize);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
我更新了上面的代码,我在这里缺少什么。
最佳答案
您已经很接近了:更改代码以创建一个包含 SQL 的 VARCHAR,使用 IF/ELSE 逻辑在其中连接您的订单。然后将此 SQL 传递给准备好的语句:
SET @sql = "Your SQL";
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
关于mysql - 为什么 VARCHAR 变量不能在 mysql 存储过程中使用内部查询作为列名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36485039/