0

私はいくつかのレポートに取り組んでおり、選択した日付に応じて異なるクエリを選択するクエリを作成しようとしています。これは、私が達成しようとしていることの単純化されたバージョンです。

SELECT *
FROM
    IF(YEAR('###date start###'=2011),table_2011,table)
WHERE
    date_start BETWEEN '###date start###' AND '###date end###'

###date start###および###date end###は、ユーザーが入力したパラメーターです。

これは単なる例であり、別のテーブルを選択する他のパラメーターが渡される可能性があるため、言語を使用して日付に応じて別のテーブルを選択することはできません。

新しいpreg_replaceを作成し、クエリを作成する人に次のようなものを追加するように強制する必要があると考えています###if(test,val2,val2)###が、mysqlがすでにこれを実行できる場合は、お湯を再発明したくありません。

ありがとうございました

編集

より良い解決策を待っている間、私は「検索置換」機能を単純なものから変更しました: ###search###=> value(### search ###が手動で入力するフィールドとしてエンドユーザーに表示されていた)、新しいものも受け入れるように次のようにフォーマットされたフィールド LLLlabel[option:value,option:value,option:value,....]LLL

このソリューションはエンドユーザーが追加のパラメーターを選択しなければならないのは煩わしいだけなので、MySQLだけでそれを実行できればと思うので、最善のソリューションではありません。

質問はクエリの非常に単純化されたバージョンにすぎないことに注意してください。クエリはサブクエリ、ユニオン、または結合の一部であり、time分離だけではありません。

4

2 に答える 2

1

次のストアドプロシージャが機能します。

DELIMITER //

CREATE PROCEDURE example(date_start DATETIME, date_end DATETIME)
BEGIN
    SET @table = IF(YEAR(date_start)=2011,'table_2011','table');

    SET @sql = CONCAT(
        "SELECT * FROM ",
        @table,
        " WHERE date_start BETWEEN ",
        QUOTE(date_start),
        " AND ",
        QUOTE(date_end)
    ); 

    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END;
//

DELIMITER ;

そしてそれを経由して呼び出す:

CALL example('###date start###', '###date end###');

または、データがMyISAMテーブルにある場合は、テーブルを設定できMERGEます。

CREATE TABLE all_tables (...) ENGINE = MERGE UNION=(table_2011, table);

SELECT *
FROM
    all_tables
WHERE
    date_start BETWEEN '###date start###' AND '###date end###'
于 2012-11-12T14:54:28.587 に答える
0

テーブルがばらばらである場合、これは機能する可能性があります。

select *
from (select * from table_2011
      union
      select * from table) x
where date_start BETWEEN '###date start###' AND '###date end###';

更新

サイズが問題になる場合は、テーブルのパーティション分割を検討する必要があります。見る

于 2012-11-12T14:51:13.370 に答える