sql >> データベース >  >> RDS >> Mysql

エイリアスとしてのMysql動的値

    内部結合の代わりに左結合を使用しているのはなぜですか?また、動的クエリを実行している場合。ストアドプロシージャの使用を検討する必要があります。 SQLステートメントを変数にマウントしてから実行できます。簡単な例を次に示します。

    CREATE DEFINER=`YourDBUSER`@`localhost` PROCEDURE `rtYourProcedureName`(IN variable1 int,variable2d varchar(100), sortBy varchar(50), startRow int, ThisSQL varchar(5000), OUT totalRows int)
    BEGIN
    ###start: MySQL is dumb and do not allow default parameter values, set here:
    SET @variable1 = IFNULL(variable1 ,'0');
    SET @variable2 = IFNULL(variable2 ,'');
    SET @sortBy = IFNULL(sortBy ,'');
    SET @startRow = IFNULL(startRow ,1);
    ###end: MySQL is dumb and do not allow default parameter values
    
    set @htwsql = ThisSQL;
    
    set @htwsql = ' SELECT SQL_CALC_FOUND_ROWS STRAIGHT_JOIN t1.field1 ,t2.field2 ';
    
    if @variable1 = 0 then
    	set @htwsql := concat(@htwsql, ' from table1 t1');
    else 
    	set @htwsql := concat(@htwsql,' from table2 t2 w INNER JOIN table1 t1 ');
    end if;
    
    set @htwsql := concat(@htwsql, ' where 1 = 1 ');
    
    
    ### sort order
    if rtrim(ltrim(@sortBy)) <> '' then
    	set @htwsql := concat(@htwsql,char(13), ' ORDER BY ' , cast(@sortBy as char(50)));
    end if;
    
    ### limit records for pagination
    set @htwsql := concat(@htwsql,char(13), ' LIMIT ', StartRow-1 ,',',24);
    
    ### just to debug the generated SQL
    insert into rtlogtmp (log) select concat ('rtYourProcedureName SQL = ',@htwsql);
    
    
    PREPARE stmt1 FROM @htwsql; 
    
    EXECUTE stmt1; 
    
    DEALLOCATE PREPARE stmt1;
    
    SELECT FOUND_ROWS() into totalRows;
    
    END

    p.s.:エイリアスとして使用する名前に注意してください。それらは予約済みのSQL構文である可能性があります。




    1. SQLクエリを使用して結果を別の行に出力するにはどうすればよいですか?

    2. PHPWebアプリケーションでタイムゾーン機能を構築する

    3. CTE への INDEX の追加

    4. AndroidのRSAは正しいキーを生成しますが、復号化が間違っています