html - 如何在 MySQL 函数中将 SQL 选择查询转换为格式化的 HTML 表

标签 html mysql sql procedure

我正在寻找一种通过将任何查询输出转换为 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 的未知和动态列。我在这里阅读了有关如何使用游标的信息,但我看到的所有示例都使用已知列并将它们分配给命名变量。但是,由于查询本身是动态的,我不知道列的名称。

非常感谢您的宝贵时间和帮助,谢谢!

附注我已将其作为一个新问题发布,因为我之前的问题被标记为过于宽泛而已关闭。我随后编辑了我的问题,但它仍然显示为已关闭。因此,我删除了旧问题并将其替换为这个问题。

最佳答案

使用这样的示例表:

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;

Example on SQL Fiddle


附录

忘记包含表格标题:

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;

Example on SQL Fiddle

关于html - 如何在 MySQL 函数中将 SQL 选择查询转换为格式化的 HTML 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30189857/

相关文章:

javascript - 具有相同类的对象有时不会隐藏

MySQL 日期精度

sql - 选择最近但不大于行

javascript - 当通过 javascript 动态设置时,输入文本框的 ng-model 值在 angularjs Controller 中未定义

html - 在 Ionic/Angular 输入框中每 3 个字符调整字母间距的最佳方法

javascript - 如何让 html 显示在页面上而不是运行?

MySQL 复制 : struggling with replicate-rewrite-db to change the database name

Mysql Append表添加列

php - 包含标签的全文搜索

sql - HAVING 的参数必须是 bool 类型,而不是整数类型