我想将数据库过滤到发生在4/5/6月和7/8/9月的数据中,这是我的语法:
select
buyer_id,
tgl
from data_2017
where
month(tgl) = 4 or month(tgl) = 5 or month(tgl) = 6 AND
buyer_id IN (select buyer_id, tgl from data_2017
here month(tgl) = 7 or month(tgl) = 8 or month(tgl) = 9);
我不知道哪种语法错误
答案 0 :(得分:0)
您的直接问题是您有一个伪命问题,其中涉及WHERE
子句中缺少括号的情况。您当前的逻辑实际上是在这样做:
WHERE
MONTH(tgl) = 4 OR MONTH(tgl) = 5 OR (MONTH(tgl) = 6 AND buyer_id IN (... subquery))
您应该在月度检查前后加上括号,以便一起进行评估。 但是,除了解决此问题外,我可能还会使用自联接来编写您的查询:
SELECT DISTINCT
d1.buyer_id,
d1.tgl
FROM data_2017 d1
INNER JOIN data_2017 d2
ON d1.buyer_id = d2.buyer_id
WHERE
MONTH(d1.tgl) IN (4, 5, 6) AND
MONTH(d2.tgl) IN (7, 8, 9);
答案 1 :(得分:0)
tgl数据类型是否为DATE?在搜索条件中的列上使用month会阻止mysql使用索引。如果它是DATE,则可以更改查询:
select
buyer_id,
tgl
from data_2017
where tgl between '2017-04-01' and '2017-06-30'
and buyer_id in (SELECT DISTINCT buyer_id FROM tgl between '2017-07-01' and '2017-09-30')
答案 2 :(得分:0)
似乎您希望在7/8/9月份中存在的Buyer_id中的任何内容都可以查找4/5/6数据。以下是您当前查询的修改版本:
SELECT
buyer_id,
tgl
FROM data_2017
WHERE MONTH(tgl) IN (4,5,6)
AND buyer_id IN (SELECT buyer_id FROM data_2017
WHERE MONTH(tgl) IN (7,8,9) GROUP BY buyer_id);