【问题标题】:SQL statement to combine both fields in one table that match the id element in another tableSQL 语句将一个表中与另一个表中的 id 元素匹配的两个字段组合起来
【发布时间】:2013-11-13 19:09:20
【问题描述】:

如果您熟悉 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                 |
====================================

术语节点:

_____________
| 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 用于我们的事件。一个 tid 将为我们提供我们的位置,另一个将使用我们的 event_type。

term_node 表给出了 tid 的名称,并为我们提供了一个 vid,告诉我们这个名称是 event_type 还是 location。

我的目标是获取所有事件的 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 行。

如果你想要它们,你可以从

中获取表构建语句

FIDDLE:SQL Fiddle.

【问题讨论】:

    标签: mysql sql drupal join drupal-taxonomy


    【解决方案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

    【讨论】:

    • 非常感谢。我只是需要多考虑一下。我期待 SQL 提供一些特殊功能,但这只是我的逻辑。 :/ 谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2017-05-02
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    相关资源
    最近更新 更多