2

stmtQueryからのすべての結果を 1 つの結果に UNION するにはどうすればよいですか?

    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 つの結果を取得したいのですが、取得した結果は 1 つだけです

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 に答える