gpt4 book ai didi

MySQL存储函数从表中的行读取列

转载 作者:行者123 更新时间:2023-11-29 17:48:59 25 4
gpt4 key购买 nike

我们需要一个函数/存储过程来返回表中一行中的列,我们在其中传递表、id 字段名称、id 和列来返回。

我们有一个表,它是一个事件日志,其中包含诸如

之类的列
  • log_datetime - 用户执行某操作的日期/时间

  • log_table - 受影响的表

  • log_idcol - log_table 中保存 id 的列

  • log_id - log_table 中行的 id

  • log_titlecol - log_table 中保存“标题”的列项目

因此,在report/MySql语句中,我需要能够列出log_titlecol中保存的列名称中的标题,从表中读取log_table列中的名称,以及log_idcol中的任何内容的id。

很像

从 log_table 中选择 log_titlecol,其中 log_idcol = log_id

其中所有的'log_;零件是可更换的。我看不到在 MySQL 中执行此操作的方法,那么有没有办法在存储过程/函数中执行此操作?

例如:

CREATE TABLE jokes (
JokeID smallint(4) NOT NULL, **(autoincrement, unique)**
Title varchar(50) CHARACTER SET utf8 DEFAULT NULL,
Note text CHARACTER SET utf8
)

CREATE TABLE idioms (
IdiomID smallint(4) NOT NULL, **(autoincrement, unique)**
IdiomTitle varchar(50) CHARACTER SET utf8 DEFAULT NULL,
Note text CHARACTER SET utf8
)

CREATE TABLE `log` (
id smallint(4) NOT NULL, **(autoincrement, unique)**
log_datetime datetime,
log_table varchar(50) CHARACTER SET utf8 DEFAULT NULL,
log_idcol varchar(50) CHARACTER SET utf8 DEFAULT NULL,
log_id smallint(4) NOT NULL,
log_titlecol varchar(50) CHARACTER SET utf8 DEFAULT NULL,
)


INSERT INTO jokes (Title, Notes)
VALUES ('Funny joke','This is note1')

INSERT INTO jokes (Title, Notes)
VALUES ('Another Funny joke','This is another note')

INSERT INTO idioms (IdiomTitle, Notes)
VALUES ('Bird in the hand','What this means..')

INSERT INTO jokes (Title, Notes)
VALUES ('Another Funny joke','This is another note')

INSERT INTO log (log_datetime, log_table, log_idcol, log_id , log_titlecol)
VALUES (now(), 'jokes','JokeID',1,'Title')

INSERT INTO log (log_datetime, log_table, log_idcol, log_id , log_titlecol)
VALUES (now(), 'jokes','JokeID',2,'Title')

INSERT INTO log (log_datetime, log_table, log_idcol, log_id , log_titlecol)
VALUES (now(), 'idioms','IdiomID',2,'IdiomTitle')

那么现在我怎样才能从日志中获得一个报告,显示笑话表中的日期时间和标题列,以及 log_id 列中的行 ID?我需要一个函数。

例如从日志中选择 log_datetime、log_table、log_id、GetTitle(log_table、log_idcol、log_id、log_titlecol)

其中 GetTitle 是一个函数,它将从 ID 为 log_id 的行(保存在 log_idcol 列中)返回作为 log_table 传递的表中“log_titlecol”中保存的列

例如输出将显示:

2018-01-01 12:00 笑话 1 个搞笑笑话
2018-01-01 12:10 笑话 2 另一个有趣的笑话
2018-01-01 12:11 成语1 手中的鸟

我已经尝试过

 CREATE PROCEDURE Getcol(IN tab TEXT CHARSET utf8mb4, IN col TEXT CHARSET utf8mb4, IN idcol TEXT CHARSET utf8mb4, IN id INT(15), OUT outcol TEXT CHARSET utf8mb4)
DETERMINISTIC
COMMENT 'Return a column from any table'
BEGIN
SET @Expression = CONCAT('SELECT ', col,' INTO @outcol FROM ', tab, ' where ', idcol, ' = ', id);
PREPARE myquery FROM @Expression;
EXECUTE myquery;
SELECT @outcol;
END

我可以这样调用它 CALL GetCol('笑话','标题','JokeID',1)

这可以返回 ID 1 的标题列,但我似乎无法将此调用放入函数中

 CREATE FUNCTION getrowcol(tab TEXT, col TEXT, idcol TEXT, id INT) RETURNS text CHARSET utf8mb4
NO SQL
COMMENT 'Return a column from any table'
BEGIN
DECLARE outvar TEXT;
CALL GetCol(tab, col, idcol, id, @out1);
SELECT @out1 INTO outvar;
RETURN outvar;
END

这将返回空白。我怎样才能返回@out1?

这本质上是同一个问题(没有答案)

https://dba.stackexchange.com/questions/151328/dynamic-sql-stored-procedure-called-by-a-function

最佳答案

尝试类似的事情,

DELIMITER //

CREATE PROCEDURE demo(tab VARCHAR(50), tit VARCHAR(50))
BEGIN
SET @Expression = CONCAT('SELECT l.log_datetime, j.',tit,' FROM `log` l INNER JOIN ',tab,' j;');
PREPARE myquery FROM @Expression;
EXECUTE myquery;

END
//

DELIMITER ;

这样调用它

CALL demo('jokes', 'title')

来自Reference

关于MySQL存储函数从表中的行读取列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49561401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com