0

複数の同一のテーブル (3 つ以上) からデータをフェッチしたいのですが、それらは同じ列名を取得しています (ただし、行のデータは異なります)。

したがって、3 つではなく 1 つのクエリ (1 つのループ) であるかのように、すべてのテーブルをループでフェッチしたいと考えています。

配列をフェッチするときに列数を 3 倍にしたくありません。すべてのテーブルで同じ列名を使用したい。テーブルのデータは、配列内の列の数を 3 倍にして、隣り合わせではなく、配列内で積み重ねられます。しかし、それらが積み重ねられると、「ORDER BY」フィルターはテーブルを「ブレンド」します。「ORDER BY」は、すべてではなく、一度にすべてのテーブルに作用します (1 つのテーブルのみの場合のように)。テーブルを個別に。

1つのテーブルに対する私のクエリは次のようになります:

$pdo = "SELECT * FROM " .$table1 ." ORDER BY price LIMIT " 
       .$current_page_offset .", " .$items_per_pages;

だから...私は1つだけをフェッチしているかのように、3つのテーブルをフェッチしたい.

*また、制限を維持し、さらに多くのフィルターを「ORDER BY」に機能させたい. ページに必要なアイテムの数の 3 倍を表示するトリプル リミットは必要ありません...

それを行う方法はありますか?

*EDIT : 第 3 段落の「ブレンド」の説明を変更しました。(たぶん)私の下手な英語でごめんなさい。

4

1 に答える 1

2

使用したいUNION

UNIONSELECT複数のステートメントからの結果を単一の結果セットに結合するために使用されます。

したがって、テーブル名が という配列にある場合$tables:

mb_regex_encoding($charset); // character set of database connection
foreach ($tables as $table) {
  $table = '`'.mb_ereg_replace('`','``',$table).'`';
  $sql[] = "(
    SELECT   *
    FROM     $table
    ORDER BY price
    LIMIT    $current_page_offset, $items_per_pages
  )";
}
$sql = implode(' UNION ALL ', $sql);

ただし、そのような「同一の」テーブルがないように、スキーマを正規化する必要があるように聞こえます。代わりに、それぞれを区別するものを示す追加の列を持つ単一のテーブルを用意します。

于 2012-08-04T20:54:13.800 に答える