【问题标题】:Left join using rows with condition使用带条件的行进行左连接
【发布时间】:2015-12-04 16:54:05
【问题描述】:

我有两张桌子:

exp_channel_titles
exp_relationships

我想从左表 (exp_channel_titles) 中选择不同的行,它们在 exp_relationships 中定义了关系。我可以这样做:

SELECT DISTINCT exp_channel_titles.title  
FROM exp_channel_titles  
LEFT JOIN exp_relationships  
ON exp_channel_titles.entry_id=exp_relationships.child_id  
WHERE exp_relationships.child_id IS NOT NULL  
AND exp_channel_titles.channel_id=5  
AND exp_channel_titles.status='open'

问题是我想确保 exp_channel_titles.status='open' 用于关系中使用的行。我发现这很难理解,所以我会尝试更好地解释。

exp_channel_titles 包含如下内容:

entry_id |标题 |状态 |频道 ID
1 |保姆 |开放| 2
2 |托儿所|开放| 5
3 |保姆 |开放| 2
4 |工商管理|开放| 5
5 |接待员|关闭| 2

exp_relationships 使用 exp_channel_titles.entry_id 作为 exp_relationships.parent_id 定义 exp_channel_titles 中的行之间的关系exp_relationships.child_id。因此,上述行将具有以下关系:
parent_id | child_id
1 | 2
3 | 2
5 | 4

所以我上面概述的查询会给我:
托儿服务
工商管理

但是因为与工商管理(接待员)相关的唯一条目的状态为“已关闭”,所以我不希望此项目出现。我希望查询只返回托儿服务。

【问题讨论】:

  • 您的查询返回什么?乍一看,它看起来还可以。虽然,如果您需要表之间的关系,则不需要执行 LEFT JOIN。你可以做一个常规的 JOIN 并摆脱 'WHERE child_id IS NOT NULL' 子句。
  • 它返回育儿和企业管理。如果我执行常规 JOIN 并摆脱 WHERE child_id IS NOT NULL,它仍然不会将 exp_channel_titles.status='open' 应用于 JOIN 中使用的行。即我仍然看到企业管理。
  • 您能否编辑您的问题以包含 exp_relationship 表/数据的示例?
  • 编辑了我的问题以显示 exp_relationship 数据。需要明确的是,exp_channel_titles 表包含父数据和子数据。
  • 我在下面发布了一个可能的解决方案。如果您愿意,您也可以加入子查询。

标签: mysql


【解决方案1】:

您可以使用这样的别名将表连接两次:

SELECT DISTINCT
    ect.title 
FROM
    exp_channel_titles ect
JOIN
    exp_relationships er
    ON ect.entry_id = er.child_id
JOIN
    exp_channel_titles ect2
    ON ect2.entry_id = er.parent_id
WHERE
    ect.channel_id = 5
    AND ect.status = 'open'
    AND ect2.status = 'open'

【讨论】:

  • 谢谢,不幸的是,这仍然会显示相关条目状态为已关闭的条目,即“业务管理”仍会显示在上面的数据集中。将研究子查询,尽管您可能已经猜到我对 SQL 的掌握并不惊人。
  • 对不起,我从我的 sql 窗口复制时遗漏了一行。我编辑了上面的查询。也许这会起作用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多