如何在 MySQL 函数中将 SQL select 查询转换为格式化的 HTML table
How to convert an SQL select query into a formatted HTML table within a MySQL function
我正在寻找一种在 MySQL(没有 PHP)内生成有效 HTML 代码的方法,方法是将任何查询输出转换为 HTML table.
这是我到目前为止的进展,显然,我被卡住了。希望能得到一些帮助,谢谢。
1. "dynSQL" - 获取任何 Select 查询并从中创建命名 table 的过程
由于 MySQL 不允许在函数中进行动态查询,我正在调用一个创建命名 table、tmp
的过程。我无法使用临时 table,因为有关临时 table 的信息在 information_schema 中不可用(在 mysql 5.6 中)
CREATE DEFINER=`root`@`%` PROCEDURE `dynSQL`(SQL_QUERY TEXT)
BEGIN
set @SQLQ := 'Drop table if exists tmp;';
PREPARE stmt from @SQLQ;
Execute stmt;
SET @SQLQ := concat('create table tmp as ',SQL_QUERY);
PREPARE stmt from @SQLQ;
Execute stmt;
-- I'm adding a auto increment ID column to be able to loop through the rows later
SET @SQLQ := "ALTER TABLE tmp add column CustColHTML_ID INT NOT NULL AUTO_INCREMENT FIRST, ADD primary KEY Id(CustColHTML_ID)";
PREPARE stmt from @SQLQ;
Execute stmt;
DEALLOCATE PREPARE stmt;
END
2。 "MakeHTML" - 从 table tmp
和 return 中读取格式化的 HTML table
的函数
CREATE DEFINER=`root`@`%` FUNCTION `MakeHTML`() RETURNS text CHARSET utf8
DETERMINISTIC
BEGIN
DECLARE HTML text default "<TABLE><TR>";
DECLARE rowCount int default 0;
DECLARE i int default 0;
select concat('<TR>',group_concat('<TD>',column_name,'</TD>' separator ''),'</TR>') into html from information_Schema.`columns` where table_name='tmp';
Select max(CustColHTML_ID) into rowCount from `tmp`; -- Set the row counter
WHILE i<=rowCount DO
-- What do I do here? How do I loop through the columns of table tmp?
set i:=i+1;
END WHILE;
RETURN HTML;
END
如您所见,我一直在循环遍历 table tmp
的未知动态列。我在这里阅读了有关如何使用游标的信息,但我看到的所有示例都使用已知列并将它们分配给命名变量。但是,由于查询本身是动态的,我不知道列的名称。
非常感谢您的宝贵时间和帮助,谢谢!
p.s。我已将其作为一个新问题发布,因为我之前的问题被标记为过于宽泛而已关闭。我随后编辑了我的问题,但它仍然显示为已关闭。因此,我删除了旧问题并将其替换为这个问题。
样本table是这样的:
CREATE TABLE tmp (ID INT, Col1 INT, Col2 INT);
您需要生成 HTML 的 SQL 是:
SELECT CONCAT('<table>', GROUP_CONCAT(CONCAT('<tr><td>',ID,'</td><td>',Col1,'</td><td>',Col2,'</td><tr>')), '</table>')
FROM tmp;
您可以使用 INFORMATION_SCHEMA
:
SELECT CONCAT
(
'SELECT CONCAT(''<table>'', GROUP_CONCAT(CONCAT(''<tr>'', ',
GROUP_CONCAT(CONCAT('''<td>'',', COLUMN_NAME, ',''</td>''')),
', ''</tr>'')), ''</table>'') FROM tmp'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'tmp';
那么就是执行这个的情况:
SET @SQL = (
SELECT CONCAT
(
'SELECT CONCAT(''<table>'', GROUP_CONCAT(CONCAT(''<tr>'', ',
GROUP_CONCAT(CONCAT('''<td>'',', COLUMN_NAME, ',''</td>''')),
', ''</tr>'')), ''</table>'') FROM tmp'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'tmp'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
附录
忘记包含 table headers:
SET @SQL = (
SELECT CONCAT
(
'SELECT CONCAT(''<table><tr>'',',
GROUP_CONCAT(CONCAT('''<th>'',''', COLUMN_NAME, ''',''</th>''')),
', ''</tr>'', GROUP_CONCAT(CONCAT(''<tr>'', ',
GROUP_CONCAT(CONCAT('''<td>'',', COLUMN_NAME, ',''</td>''')),
', ''</tr>'')), ''</table>'') FROM tmp'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'tmp'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
我正在寻找一种在 MySQL(没有 PHP)内生成有效 HTML 代码的方法,方法是将任何查询输出转换为 HTML table.
这是我到目前为止的进展,显然,我被卡住了。希望能得到一些帮助,谢谢。
1. "dynSQL" - 获取任何 Select 查询并从中创建命名 table 的过程
由于 MySQL 不允许在函数中进行动态查询,我正在调用一个创建命名 table、tmp
的过程。我无法使用临时 table,因为有关临时 table 的信息在 information_schema 中不可用(在 mysql 5.6 中)
CREATE DEFINER=`root`@`%` PROCEDURE `dynSQL`(SQL_QUERY TEXT)
BEGIN
set @SQLQ := 'Drop table if exists tmp;';
PREPARE stmt from @SQLQ;
Execute stmt;
SET @SQLQ := concat('create table tmp as ',SQL_QUERY);
PREPARE stmt from @SQLQ;
Execute stmt;
-- I'm adding a auto increment ID column to be able to loop through the rows later
SET @SQLQ := "ALTER TABLE tmp add column CustColHTML_ID INT NOT NULL AUTO_INCREMENT FIRST, ADD primary KEY Id(CustColHTML_ID)";
PREPARE stmt from @SQLQ;
Execute stmt;
DEALLOCATE PREPARE stmt;
END
2。 "MakeHTML" - 从 table tmp
和 return 中读取格式化的 HTML table
CREATE DEFINER=`root`@`%` FUNCTION `MakeHTML`() RETURNS text CHARSET utf8
DETERMINISTIC
BEGIN
DECLARE HTML text default "<TABLE><TR>";
DECLARE rowCount int default 0;
DECLARE i int default 0;
select concat('<TR>',group_concat('<TD>',column_name,'</TD>' separator ''),'</TR>') into html from information_Schema.`columns` where table_name='tmp';
Select max(CustColHTML_ID) into rowCount from `tmp`; -- Set the row counter
WHILE i<=rowCount DO
-- What do I do here? How do I loop through the columns of table tmp?
set i:=i+1;
END WHILE;
RETURN HTML;
END
如您所见,我一直在循环遍历 table tmp
的未知动态列。我在这里阅读了有关如何使用游标的信息,但我看到的所有示例都使用已知列并将它们分配给命名变量。但是,由于查询本身是动态的,我不知道列的名称。
非常感谢您的宝贵时间和帮助,谢谢!
p.s。我已将其作为一个新问题发布,因为我之前的问题被标记为过于宽泛而已关闭。我随后编辑了我的问题,但它仍然显示为已关闭。因此,我删除了旧问题并将其替换为这个问题。
样本table是这样的:
CREATE TABLE tmp (ID INT, Col1 INT, Col2 INT);
您需要生成 HTML 的 SQL 是:
SELECT CONCAT('<table>', GROUP_CONCAT(CONCAT('<tr><td>',ID,'</td><td>',Col1,'</td><td>',Col2,'</td><tr>')), '</table>')
FROM tmp;
您可以使用 INFORMATION_SCHEMA
:
SELECT CONCAT
(
'SELECT CONCAT(''<table>'', GROUP_CONCAT(CONCAT(''<tr>'', ',
GROUP_CONCAT(CONCAT('''<td>'',', COLUMN_NAME, ',''</td>''')),
', ''</tr>'')), ''</table>'') FROM tmp'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'tmp';
那么就是执行这个的情况:
SET @SQL = (
SELECT CONCAT
(
'SELECT CONCAT(''<table>'', GROUP_CONCAT(CONCAT(''<tr>'', ',
GROUP_CONCAT(CONCAT('''<td>'',', COLUMN_NAME, ',''</td>''')),
', ''</tr>'')), ''</table>'') FROM tmp'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'tmp'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
附录
忘记包含 table headers:
SET @SQL = (
SELECT CONCAT
(
'SELECT CONCAT(''<table><tr>'',',
GROUP_CONCAT(CONCAT('''<th>'',''', COLUMN_NAME, ''',''</th>''')),
', ''</tr>'', GROUP_CONCAT(CONCAT(''<tr>'', ',
GROUP_CONCAT(CONCAT('''<td>'',', COLUMN_NAME, ',''</td>''')),
', ''</tr>'')), ''</table>'') FROM tmp'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'tmp'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;