【问题标题】:How to join rows in the same table by a shared column id with a where clause?如何通过带有 where 子句的共享列 id 连接同一个表中的行?
【发布时间】:2013-03-14 23:24:51
【问题描述】:

我正在尝试编写一个 SQL 查询来查看单个 MySQL 数据库表 (exp_playa_relationships),该表存储 CMS 帖子的关系数据,其数据结构如下所示:

rel_id  |  parent_entry_id  |  parent_field_id  |  child_entry_id
-----------------------------------------------------------------
55      |  3                |  2                |  1
56      |  3                |  2                |  4
58      |  1                |  2                |  4
59      |  8                |  4                |  2
60      |  8                |  5                |  1
63      |  4                |  2                |  3
64      |  9                |  4                |  6
65      |  9                |  5                |  3

rel_id 是唯一的,其他列不是。

我想从上面的数据中生成以下内容:

event_data_id  |  user_id  |  event_id
--------------------------------------
8              |  1        |  2
9              |  3        |  6

parent_field_id 值本身在最终输出中被丢弃,但需要确定该行的 child_entry_id 是否表示 user_idevent_id

parent_entry_idevent_data_id

所以用简单的英语我想:

  1. 筛选具有parent_field_id 值为45 的行
  2. 在这些行中,我想加入所有共享相同parent_entry_id 的行。
  3. parent_entry_id 返回为event_data_id
  4. 如果同一行的parent_field_id5,则将child_entry_id 作为user_id 返回。
  5. 如果同一行的parent_field_id4,则将child_entry_id 作为event_id 返回。

我当前的 SQL 查询(不工作)是这样的:

SELECT
    t1.`parent_entry_id` AS event_data_id,
    t1.`child_entry_id` AS user_id,
    t1.`child_entry_id` AS event_id

FROM `exp_playa_relationships` AS t1
INNER JOIN `exp_playa_relationships` AS t2
ON t1.`parent_entry_id` = t2.`parent_entry_id`
WHERE t1.`parent_field_id` = 4 OR t1.`parent_field_id` = 5

我无法具体弄清楚的是如何避免在 parent_entry_id 上创建重复项(SQL 每行创建 2 个新行)以及如何根据 @987654350 返回 child_entry_id 作为 user_idevent_id @值。

任何想法都将不胜感激。

【问题讨论】:

    标签: sql select join where rows


    【解决方案1】:

    很接近了:

    SELECT t1.`parent_entry_id` AS event_data_id,
           t1.`child_entry_id` AS user_id,
           t2.`child_entry_id` AS event_id
    FROM `exp_playa_relationships` AS t1
    INNER JOIN `exp_playa_relationships` AS t2
            ON t2.`parent_entry_id` = t1.`parent_entry_id`
               AND t2.`parent_field_id` = 4
    WHERE  t1.`parent_field_id` = 5
    

    具体来说,您必须告诉它从哪个行集中提取相关数据。

    顺便说一句,您当前的数据库设计会让您更头疼这些类型的问题...我建议将信息提取到“结果”表中(除非这是为了什么?)。

    【讨论】:

    • 非常感谢您的快速回答。一切都很好。而且我想我明白发生了什么……回顾一下:我们正在将 t1 的子集减少到只有 parent_field_id5 的那些,以避免重复,然后在 INNER JOIN 中,我们正在检查 @987654325 @ 与 t1 匹配,并且基于行的 parent_field_id4,我们得到了匹配的 event_id 数据。对吗?
    • 哦,至于 DB 设计……这是 CMS(ExpressionEngine)的设计,它是附加组件,所以我自己几乎无能为力。话虽如此,我对这个查询所做的实际上是为参加某个活动的用户构建一个结果表,所以希望这将是我什至需要进入这些类型的手动 SQL 查询的唯一情况,其余的将由 CMS 本地处理。
    猜你喜欢
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多