请考虑以下行
name StringValue
foo Mac123
foo Windows123
foo Andorid123
bar Windows123
bar Andorid123
dumb Windows123
这是下面的查询返回的结果元组:
select name, stringValue from TABLE1 A, TABLE2 B, TABLE13 C
where A.id = B.id
and B.id = C.id
GROUP BY name, stringValue
如何选择名称的stringValue从未包含以“ Mac”开头的字符串,但还需要包含以“ Windows”开头的值的
这应该返回
name
bar
dumb
我所拥有的:
select name, stringValue from TABLE1 A, TABLE2 B, TABLE13 C
where A.id = B.id
and B.id = C.id
GROUP BY name, stringValue
Having stringValue LIKE "Windows" and stringValue not LIKE "Mac"
问题:上面的查询返回以“ Windows”开头的所有列。因为如果上半部分条件为真,那么后半部分也为真。
我认为问题与我的工作有关,因为我也没有按要求工作。
如何修改查询,使其返回所有名称,其中具有该名称的任何列的字符串值都不能以Mac开头,也可以以Windows开头。
答案 0 :(得分:3)
不需要连接。带有特定HAVING
子句的聚合应该做到这一点:
SELECT name
FROM t
GROUP BY name
HAVING COUNT(CASE WHEN stringvalue LIKE 'WINDOWS%' THEN 1 END) > 0
AND COUNT(CASE WHEN stringvalue LIKE 'MAC%' THEN 1 END) = 0;
答案 1 :(得分:2)
使用hading子句并检查字符串开头的总和。之所以有效,是因为在MySQL中,布尔表达式的false值为0
,为true的1
。
SELECT name
FROM a
INNER JOIN b
ON b.id = a.id
INNER JOIN c
ON c.id = b.id
GROUP BY name
HAVING sum(stringvalue LIKE 'Mac%') = 0
AND sum(stringvalue LIKE 'Windows%') > 0;
答案 2 :(得分:0)
此查询:
select name, stringValue
from TABLE1 A, TABLE2 B, TABLE13 C
where A.id = B.id
and B.id = C.id
GROUP BY name, stringValue
表现得与众不同
要执行所需的操作,只需在过滤器中添加一些通配符即可:
select name, stringValue
from TABLE1 A, TABLE2 B, TABLE13 C
where A.id = B.id
and B.id = C.id
and stringValue LIKE "Windows%"
GROUP BY name, stringValue