Оператор SQL для объединения обоих полей в одной таблице, которые соответствуют элементу id в другой таблице
Если вы знакомы с Drupal, он использует 2 термина таксономии для описания каждого узла content_type_event. Если вы не знаете Drupal, у вас все еще есть все ниже.
Я создал SQL Fiddle, который легче отслеживать и тестировать, чем мои нарисованные таблицы. Скрипка имеет фактический контент базы данных, который немного отличается от примера информации, показанной ниже, но я постарался сделать их максимально похожими.
У меня есть три таблицы:
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 |
=============
term_data:
__________________________
| 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
таблица имеет все tid (идентификатор термина), который идет к каждому nid (идентификатор узла). Каждый нид должен иметь 2 тид для наших событий. Одна часть покажет нам наше местоположение, другая даст использовать наш event_type.
term_node
Таблица дает имя tid и дает нам vid, который сообщает, является ли это имя типом события или местоположением.
Моя цель - получить nid, location, 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 строк, содержащих частичную информацию.
Если вы хотите их, вы можете получить инструкции построения таблицы из
FIDDLE: SQL Fiddle.
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;