【发布时间】: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