mysql - 为什么 VARCHAR 变量不能在 mysql 存储过程中使用内部查询作为列名?

标签 mysql stored-procedures

是否有一种解决方案可以在 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 here filter is a varchar 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/

相关文章:

mysql - 类别页面无法正常工作 Magento 2 包含超过 1300 万种产品

php - 在数组中查找最后一个非零值

mysql - 需要创建 MySQL 过程以根据条件从表中获取数据并将它们插入到另一个表中

sql-server - 退出存储过程

php - mysql_pconnect 生产安全吗?

mysql - 减去 2 个 SQL 查询的输出

c# - 异步运行存储过程

c# - 返回已处理记录数的 SQL Server 存储过程

sql-server - TSQL - 在事务语句中创建存储过程

php - 如何在一个查询中使用这两个选择查询