2

如何将 stmtQuery 的所有结果联合表 basia 和 Comments_11 ....等的一个结果示例结果

    DELIMITER $$
DROP PROCEDURE IF EXISTS SearchUserY $$
CREATE PROCEDURE `SearchUserY`(IN UserIdValue INT(11) )
BEGIN
       DECLARE done INT DEFAULT FALSE;
       DECLARE tableName VARCHAR(50);
       DECLARE stmtFields TEXT ; 
       DECLARE columnName VARCHAR(50) default 'UserId';

        DECLARE cursor1 CURSOR FOR
            SELECT table_name
            FROM information_schema.COLUMNS
            WHERE table_schema = 'comments' 
            AND column_name LIKE '%UserId';

        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;


        OPEN cursor1;
        read_loop: LOOP
        FETCH cursor1 INTO tableName;
        IF done THEN
            LEAVE read_loop;
        END IF;

      SET stmtFields = CONCAT('`',tableName,'`','.' , columnName ,'=', UserIdValue) ;


     SET @stmtQuery=CONCAT(@sql,'SELECT Nick, Title, Content FROM ' ,'`',tableName,'`', ' WHERE ', stmtFields ) ;
   select @stmtQuery;


        END LOOP;

       PREPARE stmt FROM @stmtQuery ;
       EXECUTE stmt ;

       DEALLOCATE PREPARE stmt;
       CLOSE cursor1;
END

结果示例(选择@stmtQuery):

     SELECT Nick, Title, Content FROM `basia` WHERE `basia`.UserId=0
     SELECT Nick, Title, Content FROM `Comments_11` WHERE `Comments_11`.UserId=0
     ... etc

我想从所有这些查询中得到一个结果,但我知道我只得到一个结果

4

1 回答 1

2

使用 CONCAT 函数在循环中生成查询,在它们之间添加“UNION”或“UNION ALL”子句,然后使用准备好的语句执行结果查询。

没有光标的解决方案:

SET @resultQuery = NULL;
SELECT
  GROUP_CONCAT(
    DISTINCT
    CONCAT('SELECT Nick, Title, Content FROM ', table_name, ' WHERE UserId = ', UserIdValue)
    SEPARATOR '\r\nUNION\r\n'
  )
INTO
  @resultQuery
FROM
  information_schema.COLUMNS
WHERE
  table_schema = 'comments' AND column_name LIKE '%UserId';

SELECT @resultQuery;

它将产生如下结果:

SELECT Nick, Title, Content FROM table1 WHERE UserId = 10
UNION
SELECT Nick, Title, Content FROM table2 WHERE UserId = 10
UNION
SELECT Nick, Title, Content FROM table3 WHERE UserId = 10
UNION
SELECT Nick, Title, Content FROM table4 WHERE UserId = 10
...

如果需要,增加group_concat_max_len变量。它是 GROUP_CONCAT() 函数允许的最大结果长度,默认值 = 1024。

于 2012-08-09T12:15:53.380 回答