2

Drupal に精通している場合、これは 2 つの分類用語を使用して各 content_type_event ノードを説明しています。Drupal を知らない場合でも、以下のすべてを利用できます。

引き出されたテーブルよりも簡単に追跡およびテストできるSQL Fiddleを作成しました。フィドルには、以下に示すサンプル情報とは少し異なる実際のデータベース コンテンツがありますが、できるだけ似たものにしようとしました。

私は3つのテーブルを持っています:

content_type_event:

____________________________________
| nid | field_eventstartdate_value |
------------------------------------
|  17 | 1984581600                 |
|  18 | 1984581600                 |
|  19 | 1984581600                 |
|  20 | 1984581600                 |
|  22 | 1984581600                 |
====================================

term_node:

_____________
| nid | tid |
-------------   
|  17 |   6 |   
|  17 |  15 |
|  18 |   7 |  
|  18 |  17 |
|  19 |   6 |
|  19 |  15 |
|  20 |  16 |
|  20 |   9 |
|  22 |  10 |
|  22 |  15 |
=============

用語_データ:

__________________________
| tid | vid |    name    |
--------------------------
|   6 |  4  | Location 1 |
|  15 |  3  |    Event 1 |
|   7 |  4  | Location 2 |
|   9 |  4  | Location 3 |
|  10 |  4  | Location 4 |
|  16 |  3  |    Event 2 |
|  17 |  3  |    Event 3 |
==========================

テーブルにはイベントに関する情報が含まれていcontent_type_eventますが、場所とイベントの種類については、さらに掘り下げる必要があります。

テーブルには、term_node各 nid (ノード ID) に送られるすべての tid (用語 ID) が含まれています。各 nid には、イベント用に 2 つの tid が必要です。1 つの tid は場所を提供し、もう 1 つは event_type を使用します。

テーブルは tidのterm_node名前を示し、この名前が event_type または場所であるかどうかを示す vid を示します。

私の目標は、すべてのイベントの nid、場所、event_type、field_eventstartdate_value を取得することです。次のすべては将来開始されるため、次のようになります。

______________________________________________________________
| nid |  location  | event_type | field_eventstartdate_value |
--------------------------------------------------------------
| 17  | Location 1 |   Event 1  |                 1984581600 |
| 18  | Location 2 |   Event 3  |                 1984581600 |
| 19  | Location 1 |   Event 1  |                 1984581600 |
| 20  | Location 3 |   Event 2  |                 1984581600 |
| 22  | Location 4 |   Event 1  |                 1984581600 |
==============================================================

私はSQLがあまり得意ではありません。これは私がこれまでに持っているものです:

SELECT event.nid, event.field_eventstartdate_value, location.name, event_type.name
FROM content_type_event AS event 
JOIN term_node ON term_node.nid = event.nid
LEFT JOIN (
  SELECT tid, name AS location FROM term_data WHERE vid = 4
) AS location ON location.tid = term_node.tid
LEFT JOIN (
  SELECT tid, name AS location FROM term_data WHERE vid = 3
) AS event_type ON event_type.tid = term_node.tid;

しかし、これは私に与えます:

______________________________________________________________
| nid |  location  | event_type | field_eventstartdate_value |
--------------------------------------------------------------
| 17  |       NULL |   Event 1  |                 1984581600 |
| 17  | Location 1 |      NULL  |                 1984581600 |
| 18  |       NULL |   Event 3  |                 1984581600 |
| 18  | Location 2 |      NULL  |                 1984581600 |
| 19  |       NULL |   Event 1  |                 1984581600 |
| 19  | Location 1 |      NULL  |                 1984581600 |
| 20  |       NULL |   Event 2  |                 1984581600 |
| 20  | Location 3 |      NULL  |                 1984581600 |
| 22  |       NULL |   Event 1  |                 1984581600 |
| 22  | Location 4 |      NULL  |                 1984581600 |
==============================================================

これらの結果をグループ化できないように見えるので、部分的な情報を含む 2 つの行ではなく、イベントごとに完全な行を 1 つ取得します。

それらが必要な場合は、テーブル構築ステートメントを

フィドル: SQL フィドル

4

1 に答える 1

1

これが必要だと思います:

SELECT
  event.nid,
  location.location,
  event_type.event_type,
  event.field_eventstartdate_value
FROM
  content_type_event AS event
LEFT OUTER JOIN (
   SELECT
      nid,
      name AS location
    FROM
      term_data JOIN
      term_node ON term_data.tid=term_node.tid
    WHERE term_data.vid = 4) AS location ON location.nid = event.nid
LEFT OUTER JOIN (
   SELECT
      nid,
      name AS event_type
    FROM
      term_data JOIN
      term_node ON term_data.tid = term_node.tid
    WHERE term_data.vid = 3) AS event_type ON event_type.nid = event.nid;

http://sqlfiddle.com/#!2/c2459/17/0

于 2013-11-13T19:24:26.823 に答える