ビュー3.3を使用して、2つのコンテンツタイプを表示しているDrupal 7にビューがあります。コンテンツタイプの1つにのみ接続されているフィールドの値に基づくフィルター基準があります。 。そのフィールド基準がある限り、ビューはINNER JOIN
、そのフィールドがアタッチされていない最初のコンテンツタイプのビューを返さないようにします。
ビューからクエリをコピーし、INNER
をLEFT
結合に変更して、それをmysqlシェルに貼り付け、期待どおりのすべての行を取得しました。しかし、ビューエディターでこれらの変更を行う方法がわかりません。
ビューエディターの 'relationship'ブロックで遊んでいましたが、結合の種類を変更できる場所がわかりませんでした。
ビュー3.3の結合方法を変更できますか?
hook_views_query_alter()
を使用して変更しました。 $ viewおよび$ queryオブジェクトへの参照を取得します。ビューの名前をチェックして、目的のビューであるかどうかを確認し、目的のテーブルのクエリオブジェクトの結合タイプを変更しました。
function my_module_views_query_alter(&$view, &$query) {
if($view->name == 'my_view') {
$query->table_queue['field_data_field_my_field']['join']->type = "LEFT";
}
}
reduce duplicates
チェックボックスが変換されましたINNER JOINs
からLEFT JOINs
:
次のようなものをクエリに挿入する前に:
INNER JOIN {field_data_field_random_field field_data_field_random_field}
ON node.nid = field_data_field_random_field.entity_id
AND (field_data_field_random_field.entity_type = 'node'
AND field_data_field_random_field.deleted = '0')
これらの内部結合は単純な分類フィルターによって引き起こされていたため、残念なことに、不要な関係はありませんでした。ただし、このチェックボックスをオンにしても、他の方法でクエリが変更されたようには見えないため、内部結合を削除しないでください。そして、生命と呼ばれるこの広大なサルの冒険で他の誰かを助けるかもしれません。
ビューの[関係]タブに移動すると、[この関係を必須にする]というチェックボックスがあります。
AND/ORグループをビューで使用している人のために、完全性のためにいくつかの情報を追加するだけです。
私は、最後の2つの条件を切り替えると、内部結合と左結合の間でそれを変更するフィルター基準を持っています。
私の現在のフィルター基準を説明すると、基本的にこれは:
(Published = "Yes" AND Content Type = "Blog) AND ((Blog Type = "X") OR (Blog Type IS NULL))
これは、INNER JOINを使用しており、希望する結果が得られません。 OR=の最後の2つの条件を交換するだけで、JOINタイプが変更されます。
(Published = "Yes" AND Content Type = "Blog) AND ((Blog Type IS NULL) OR (Blog Type = "X"))
これはLEFT JOINを使用します。図に行くが、他の誰かのために役立つ可能性があります。
ビューフィルターによっては、パッチが必要になる場合があります https://www.drupal.org/node/1766338