我试着查看类似的问题,但找不到它(如果我错过了链接,请随意关闭它)。
这是我的结构:
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-01
和2013-01-30
之间发生订阅,这些订阅发生在网站ID 2
和Pole type_id 3
中。
除pole.type_id
外,一切正常。我可以把它改成我想要的,它完全被忽略了。
由于一个站点可以有多个极点,我没有直接关系。 subscriptions
包含指向site
的链接(通过site_id),但我执行其他工作以获取极点,poles
与site
有直接链接,因此忽略了type_id
约束。
但是,如何按type_id
进行过滤?
答案 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
希望它能正常工作并过滤掉你想要按类型过滤的结果