另一个加入&在MySQL查询中的情况

时间:2013-08-09 15:12:51

标签: mysql join where-clause

我试着查看类似的问题,但找不到它(如果我错过了链接,请随意关闭它)。

这是我的结构:

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),但我执行其他工作以获取极点,polessite有直接链接,因此忽略了type_id约束。

但是,如何按type_id进行过滤?

1 个答案:

答案 0 :(得分: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极点p ON(p.site_id = s.id AND p.type_id = 3)将加入极数表 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

希望它能正常工作并过滤掉你想要按类型过滤的结果