【问题标题】:Another join&where situation in MySQL queryMySQL查询中的另一种join&where情况
【发布时间】:2013-08-09 15:12:51
【问题描述】:

我试图查看类似的问题,但找不到(如果我错过了链接,请随时将其关闭为重复)。

这是我的结构:

subscriptions (id, day, site_id)
sites (id, name, pole_id)
poles (id, name, type_id)
poletypes (id, name)

这是我的查询:

SELECT sub.id FROM `subscriptions` sub 
LEFT JOIN sites s ON sub.site_id = s.id
LEFT JOIN poles p ON p.site_id = s.id 
WHERE sub.day BETWEEN '2013-01-01' AND '2013-01-30' AND s.id = 2 AND p.type_id = 3

为简化起见,我希望订阅发生在 2013-01-012013-01-30 之间,发生在站点 ID 2 和 Pole type_id 3 中。

一切正常,除了pole.type_id。我可以将其更改为我想要的任何内容,它完全被忽略了。

由于一个站点可以有多个极点,因此我没有直接关系。 subscriptions 包含指向 site 的链接(通过 site_id),但我为极点做了其他工作,它是 poles 直接链接到 site,因此忽略了 type_id 约束。

但是,我该怎么做才能按type_id 过滤呢?

【问题讨论】:

  • 你可以用你当前的结果集添加小提琴,并添加所需的结果集,这样有助于查看问题

标签: mysql join where-clause


【解决方案1】:

另一种选择是加入必要的记录而不是加入整个表

SELECT sub.id FROM `subscriptions` sub 
LEFT JOIN sites s ON sub.site_id = s.id
LEFT JOIN poles p ON (p.site_id = s.id  AND p.type_id = 3 ) 
WHERE sub.day BETWEEN '2013-01-01' AND '2013-01-30' AND s.id = 2

使用 LEFT JOIN poles p ON (p.site_id = s.id AND p.type_id = 3 ) 将加入poles table where p.type_id = 3

您可以在查询中使用子选择的其他方式

SELECT q.id FROM (
    SELECT sub.id,p.type_id  FROM `subscriptions` sub 
    LEFT JOIN sites s ON sub.site_id = s.id
    LEFT JOIN poles p ON (p.site_id = s.id) 
    WHERE sub.day BETWEEN '2013-01-01' AND '2013-01-30' AND s.id = 2
) q WHERE type_id = 3

希望它工作正常并过滤掉您想要按 type_id 过滤的结果

【讨论】:

  • 在您的第二个示例中,您的子选择返回两列,这是否正常(它应该失败,因为您希望一列作为您的主查询,对吧?)
  • 是的,这是正常的,因为在父查询中我必须使用列 p.type_id 进行过滤,如果我不会在子查询中选择此列,那么我无法在父查询中进行过滤,因此我必须选择两列
  • 哦,好吧!感谢您的解释:)我找到了解决方案,但它很愚蠢,我没有在这里指出(我有一个指向 site_id 的链接,但我应该使用另一个可以更好地加入的表,但我没有t 包含在我的问题中,你不可能找到它;))我会关闭我的答案,但我会给你一个 +1 的时间,很抱歉。
  • @CyrilN。没问题的哥们
猜你喜欢
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多