【发布时间】:2015-07-23 06:24:39
【问题描述】:
我正在寻找一种方法,通过将任何查询输出转换为 HTML 表,在 MySQL(无需 PHP)中生成有效的 HTML 代码。
这是我到目前为止的进展,显然,我被困住了。希望能得到帮助,谢谢。
1. "dynSQL" - 一个过程来获取任何 Select 查询并从中创建一个命名表
由于 MySQL 不允许在函数中进行动态查询,因此我正在调用一个创建命名表 tmp 的过程。我不能使用临时表,因为有关临时表的信息在 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" - 从表 tmp 读取并返回格式化的 HTML 表的函数
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
如您所见,我一直在循环遍历表 tmp 的未知列和动态列。我在这里了解了如何使用游标,但我看到的所有示例都使用已知列并将它们分配给命名变量。但是,由于查询本身是动态的,所以我不知道列的名称。
非常感谢您的时间和帮助,谢谢!
附言我已将此作为一个新问题发布,因为我之前的问题被标记为关闭,因为太宽泛了。我随后编辑了我的问题,但它仍然显示为已关闭。因此,我删除了较旧的问题并用这个问题替换它。
【问题讨论】:
-
你知道你使用的表名吗?你可以用这个我想:stackoverflow.com/questions/4950252/…
-
为什么要使用查询来呈现 html?当然这在应用层处理得更好?
-
@GarethD 是的,在我之前的问题中也提出了这个问题。我在 MySQL 中这样做的原因是我可以让事件将查询呈现为 HTML 表并将其插入另一个 MySQL 表 (emailPendingTable)。外部的“EmailSender”程序会定期扫描此邮件并将格式化的邮件发送给预期的收件人。
-
@JeremyC。嗨,谢谢。我还考虑过一个游标循环遍历表
tmp的列。外部循环必须针对表中的每一行运行,而内部循环必须针对每一列。要提取每个单元格的值(以便我可以用标签填充它),我必须生成一个动态查询,从当前行中选择特定列。我必须进行 mXn 查询似乎太过分了,因此我想知道是否可以一次选择一整行,然后在构建 HTML 表时遍历该结果集的每一列。 -
好吧,除非您有数百列(我怀疑),否则我并没有真正看到循环遍历每一行的列名的问题,而且我真的没有看到任何其他方式这样做待