ビュー3.3で内部結合を左結合に変更しますか?


7

ビュー3.3を使用して、Drupal 7で2つのコンテンツタイプを表示するビューがあります。いずれかのコンテンツタイプにのみ関連付けられているフィールドの値に基づくフィルター条件があります。そのフィールド基準がある限り、ビューはを実行しているためINNER JOIN、そのフィールドがアタッチされていない最初のコンテンツタイプのビューは返されません。

ビューからクエリをコピーINNERし、をLEFT結合に変更して、それをmysqlシェルに貼り付け、期待どおりのすべての行を取得しました。しかし、ビューエディターでこれらの変更を行う方法がわかりません。

ビューエディターの「関係」ブロックで遊んでいましたが、結合タイプを変更できる場所がわかりませんでした。

ビュー3.3の結合方法を変更できますか?


2
ただのメモ。この動作は、Views 3.5以降のバグです。drupal.org/ node
geerlingguy

回答:


19

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')

これらの内部結合は単純な分類フィルターによって引き起こされていたため、残念なことに、不要な関係はありませんでした。ただし、このチェックボックスをオンにしても、他の方法でクエリが変更されたようには見えないため、内部結合を削除しないでください。そして、人生と呼ばれるこの広大なサルの冒険で他の誰かを助けるかもしれません。


1
これは、ブールフィールド、分類用語などのフィルターを追加するときに役立ちます。ありがとうございます。
geerlingguy 2014

「重複の削減」オプションは、結合フィールドのテーブルに存在しない場合、それらのノードを考慮しません。したがって、hook_views_query_alter()この場合の解決策はより有望なようです。
Pratip Ghosh

11

以前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";
  }
}

既存のGUIを使用して実行できるのに、views_query_alterを使用する理由は何ですか?drupal.stackexchange.com/questions/52449/…–
Gokul NK

このコードは私にこのエラーを引き起こしました:致命的なエラー:C:\ xampp \ htdocs \ sarpoosh \ sites \ all \ modules \ views \ plugins \ views_plugin_query_default.incの1313行の未定義のメソッドstdClass :: build_join()への呼び出し
shekoufeh

2
@GokulNKすべてのビューがリレーションシップを使用するわけではないため(OPのビューはリレーションシップを使用しません)、このUIオプションはリレーションシップベースでない結合では使用できません。
coredumperror 2016

4

ビューの[関係]タブに移動すると、[この関係を要求する]というチェックボックスがあります。

ここに画像の説明を入力してください

  1. このチェックボックスを選択すると、次のことを意味します。内部結合を作成する
  2. このチェックボックスをオフにすると、次のことを意味します:左結合を行う

このような問題が発生しました。問題は「この関係が必要」であると思いましたが、変更しても問題は解決しませんでした。「重複を減らす」をチェックすると問題が解決しました。
ndvo 2017年

1

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を使用します。図に行くが、他の誰かのために役立つ可能性があります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.