web-dev-qa-db-ja.com

カスタムSQL:ノード参照結合と最新のビデオ

カスタム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
1
ack
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は必要ありません。関係が必要であると指定しない限り、これはビューがデフォルトで行うことです。

0
Berdir