0

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

这是我的结构:

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,发生在 Site id2和 Pole type_id3中。

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

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

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

4

1 回答 1

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

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

于 2013-08-09T15:34:32.927 回答