MySQL选择NOT LIKE行

时间:2014-04-24 11:18:43

标签: mysql sql

这就是我的表格:

SELECT table2.status, table1.title 
FROM table1 RIGHT JOIN table2 ON table1.id = table2.id 

status    title
EXPIRED   USER A
EXPIRED   USER B
ACTIVE    USER B
EXPIRED   USER C

我想从状态不活跃的用户那里得到标题,我试过了:

SELECT table2.status, table1.title 
FROM table1 RIGHT JOIN table2 ON table1.id = table2.id 
WHERE table2.status NOT LIKE 'ACTIVE'

status    title
EXPIRED   USER A
EXPIRED   USER B
EXPIRED   USER C

问题是用户B的状态为ACTIVE和EXPIRED,我想要一个表 向我展示了表中没有活动状态的所有人:

status    title
EXPIRED   USER A
EXPIRED   USER C

4 个答案:

答案 0 :(得分:3)

如果您展示了表格结构,那将会有所帮助。但这是解决这个问题的一种方法:

select t1.*
from table1 t1
where not exists (select 1
                  from table2 t2
                  where t2.id = t1.id and
                        t2.status = 'ACTiVE'
                 );

答案 1 :(得分:1)

这是一个语句,为每个非活动用户提供一行:

SELECT 
  CASE 
    WHEN MAX( case when table2.status = 'EXPIRED' then 1 else 0 end ) = 1 THEN 'EXPIRED'
    WHEN MAX( case when table2.status = 'CANCELLED' then 1 else 0 end ) = 1 THEN 'CANCELLED'
    WHEN MAX( case when table2.status = 'NEW' then 1 else 0 end ) = 1 THEN 'NEW'
    ELSE 'NOT ACTIVE'
  END as status
  table1.title 
FROM table1 
INNER JOIN table2 ON table1.id = table2.id 
GROUP BY table1.title
HAVING MAX( case when table2.status = 'ACTIVE' then 1 else 0 end ) = 0;

这里的技巧是获取所有行,按用户分组,如果用户存在ACTIVE状态,则创建一个标志。如果是这样,请从HAVING子句的列表中删除用户。然后我们决定显示哪个状态。我们再次使用聚合标志来确定我们的首选标志“EXPIRED”是否存在,否则“取消”等等。

BTW:我删除了右外连接,因为它对我没有意义。如果真的发生了在table1中没有条目的用户,那么外连接,但在结果列中有table2.id,而不是由table1.title组成。

答案 2 :(得分:0)

选择状态未激活的标题。

select * from table_name 
where title not in( select distinct title 
                    from table_name 
                    where status = 'ACTIVE' )

子查询会获取状态为ACTIVE
的标题 外部查询提取标题不在ACTIVE状态的所有记录。

答案 3 :(得分:0)

可能使用额外的外连接,如下所示: -

SELECT table2.status, table1.title 
FROM table2 
LEFT OUTER JOIN table1 
ON table1.id = table2.id 
LEFT OUTER JOIN table2 table2a
ON table1.id = table2a.id 
AND table2a.status LIKE 'ACTIVE'
WHERE table2.status NOT LIKE 'ACTIVE'
AND table2a.id IS NULL

再次反对table2但仅针对活动记录,然后在WHERE子句中检查活动记录的连接行是否为空(即,未找到)