我有两个mysql表
表1:
ID data status
1 data1 1
2 data2 1
3 data3 0
4 data4 1
表2:
ID lastLoginDate specialID
1 2018-09-10 abc
2 2018-03-16 xyz
3 2018-02-20 foo
4 2018-06-18 bar
两个表之间的通用数据是ID列。
我有一个特定的值列表,我想在table2中找到,但我也想包含只包含来自Table1的数据(状态为1且来自Table2的lastLoginDate小于'2018-03)的结果-17'
这是到目前为止我尝试使用的代码,但是它不起作用:
SELECT Table1.data, Table2.ID, Table2.specialID
FROM Table1, Table2
WHERE Table2.SpecialID IN ('acb, foo') OR Table2.ID IN
(SELECT Table2.ID
FROM Table1, Table2
WHERE Table1.ID = Table2.ID
AND Table1.status = '1'
AND Table2.lastLoginDate < '2018-03-17'
)";
预期结果:
data ID specialID
data1 1 abc
data2 2 xyz
结果不应包含ID“ 3”,因为表1中的状态为“ 0”,即使在“ IN”列表中包含了特殊ID。
此外,结果也不应包含ID“ 4”,因为specialID未包含在“ IN”列表中,并且“ lastLoginDate”大于“ 2018-03-17”。
同样,有2个总体条件 1.必须在“ IN”列表中(仅当状态为“ 1”时) 2.需要位于lastLoginDate之内(如果出现在“ IN”列表中,该列表应覆盖此条件,但是仅当状态为“ 1”时)
我不确定是否需要将其分为两个查询才能正常工作。希望有人可以帮助我解决这个问题。
答案 0 :(得分:2)
如果您不希望在in列表中执行以下操作,那么最后一次特定的登录将需要这样的内容
select t1.data, t2.id, t2.specialID
from table1 t1
inner join table2 t2
on t1.id = t2.id
where t1.status = 1
and (t2.specialID in('abc','foo') or t2.lastloginDate <'2018-03-17')
答案 1 :(得分:-1)
我认为您的操作过于复杂,按ID进行简单匹配应删除没有按ID进行匹配的任何结果(与进行内部联接相同),对于其余条件,您可以将其添加到where子句:
Select t1.data, t1.id, t2.specialID
from Table1 as T1, Table2 as T2
where t1.id = t2.id
and t1.status = 1
and t2.specialId in ('abc','foo')
and t2.login_date < '2018-03-17' ;