カスタムSQLクエリを作成するのに時間がかかっています。 クエリには複数のノード参照があり、最新のノードリビジョンを返す必要があります。結合はかなりよく理解していますが、何らかの理由で、最新のリビジョンを返すという複雑さが増しているため、つまずきます。
WHERE
句が複雑であるという理由だけで、ビューを作成してプログラムで実行するよりも、このルートを使用したいと思います。
同等のViewの出力を翻訳しようとしましたが、Viewsが付加する接頭辞により、理解するのが非常に面倒になっています。私の本能は、それほど多くの結合を必要とすべきではないということです。
人々が始めるかもしれない一般的な構造を見たいです、または会話のために、ここに私が取り組んでいるものの非常に単純化されたバージョンがあります。このバージョンは少し流動的です。最新のリビジョンがカバーされていると思いますが、person1Name、person2Nameは何も返しません。
SELECT event.nid AS eventnid,
event.field_event_date_value AS date,
event.field_event_person1_nid AS person1Nid,
person1.field_person_name_value AS person1Name,
event.field_event_person2_nid AS person2Nid,
person2.field_person_name_value AS person2Name,
FROM {node} n
LEFT JOIN {content_type_event} event
ON n.vid = event.vid
LEFT JOIN {node} refevent
ON event.vid = refevent.nid
LEFT JOIN {content_type_person} person1
ON refevent.vid = person1.nid
LEFT JOIN {content_type_person} person2
ON refevent.vid = person2.nid
LEFT JOIN {node} refevent
ON event.vid = refevent.nid
LEFT JOIN {content_type_person} person1
ON refevent.vid = person1.nid
LEFT JOIN {content_type_person} person2
ON refevent.vid = person2.nid
これは間違っているようです。代わりに、refevent.vidの代わりにevent.field_event_person1_nidと2を使用することをお勧めします。ノードの追加の結合は必要ありません。すでにメインテーブルとしてノードがあります。
LEFT JOINを使用しているため、クエリは引き続き何かを返します。これらのフィールドは必須であるか、入力されたフィールドのみが必要であると想定しているため、JOINを使用する必要があります。 LEFT JOINは、結合されたテーブルに一致する行がない場合でも、メインテーブルが返されることを意味します。
Content_type_eventテーブルについても同じことが言えます。 LEFTJOINは必要ありません。関係が必要であると指定しない限り、これはビューがデフォルトで行うことです。