Drupal 7を使用していますが、複数のテーブルで結合する必要があります。組合が機能するためには、いくつかの条件を満たす必要があります。
- 同数の列
- 同じデータ型
- 同じ注文
一部のテーブルには列がないため、これを補うために、次のようなものを追加します$query->addExpression(':field_1', 'field_1', array(':field_1' => NULL));
。したがって、この時点で条件1と2は満たされますが、選択のフィールドの順序は異なります。
以下の例を参照してください。
$query_1 = db_select('table_one', 't1');
$query_1->fields('t1', array('field_1', 'field_2'));
$query_2 = db_select('table_two', 't2');
if (true) {
$query_2->fields('t2', array('field_1'));
} else {
$query_2->addExpression(':field_1', 'field_1', array(':field_1' => NULL));
}
$query_2->fields('t2', array('field_2'));
$query_3 = db_select('table_three', 't3');
if (false) {
$query_3->fields('t3', array('field_1'));
} else {
$query_3->addExpression(':field_1', 'field_1', array(':field_1' => NULL));
}
$query_3->fields('t3', array('field_2'));
そして結果は次のとおりです。
// dpq($query_1);
SELECT t1.field_1 AS field_1, t1.field_2 AS field_2
FROM {table_one} t1
// dpq($query_2);
SELECT t2.field_1 AS field_1, t2.field_2 AS field_2
FROM {table_two} t2
// dpq($query_3);
SELECT t3.field_2 AS field_2, '' AS field_1
FROM {table_three} t3
// dpq($query_1->union($query_2)->union($query_3));
SELECT t1.field_1 AS field_1, t1.field_2 AS field_2
FROM {table_one} t1
UNION SELECT t2.field_1 AS field_1, t2.field_2 AS field_2
FROM {table_two} t2
UNION SELECT t3.field_2 AS field_2, '' AS field_1
FROM {table_three} t3
を使用して$query->addExpression
も、フィールドの位置が期待どおりになるとは限らないようです。使用された3番目のクエリのダンプを見てくださいaddExpression
。この問題を解決する方法について何かアイデアはありますか?