表上的过程UNION

时间:2012-08-09 11:39:31

标签: mysql union procedure

如何将来自 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

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

1 个答案:

答案 0 :(得分: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。