MySQL选择X喜欢a而不喜欢B的位置
我需要选择一些数据,但我无法以我需要的方式进行选择,并且我无法找到查询中的问题 数据如下:MySQL选择X喜欢a而不喜欢B的位置,mysql,select,Mysql,Select,我需要选择一些数据,但我无法以我需要的方式进行选择,并且我无法找到查询中的问题 数据如下: user | priority | group user-a | 5 | other user-b | 5 | none-a user-b | 2 | some-grp user-c | 5 | other-a user-d | 5 | other-b 基本上,一个用户可以有多个具有优先级的组,我
user | priority | group
user-a | 5 | other
user-b | 5 | none-a
user-b | 2 | some-grp
user-c | 5 | other-a
user-d | 5 | other-b
基本上,一个用户可以有多个具有优先级的组,我不需要筛选没有特定组的用户
im使用的查询是:
SELECT *
FROM tableName
WHERE group LIKE "other%" OR group LIKE "none%"
AND group NOT LIKE "some%"
LIMIT 0 , 30
但此查询将返回所有结果,而不是用户a/c/d,类似的忽略和不类似的
MySQL 5.5.30架构设置:
问题1:
:
如果不想显示包含在特定组中的用户,可以将not in与非相关子查询或not EXISTS与相关子查询策略一起使用 不在非相关子查询中 与相关子查询不存在
使用左连接,但仅保留不连接的行: 您的WHERE子句中也有一个错误,在括号内的OK条件在这里被修复,这将由于运算符优先级导致错误的逻辑
还必须猜测用户id列是什么-您可能需要对此进行调整。我认为这是一个集合内集合查询。我喜欢使用聚合和have来处理这些问题,因为这是一种非常灵活的方法
select user
from t
group by user
having sum(group LIKE 'other%') > 0 or
(sum(group LIKE 'none%' > 0 and
sum(group like 'some%') = 0
)
这基本上是在having子句中转换where子句,该子句对一条记录进行操作,having子句统计组中每个模式的出现次数。group是一个mysql保留字。你需要使用这些小记号来逃避它:分组-在这样的情况下,它是用于突出显示代码的bb代码,看起来我的SmartPass示例失败了。优先级顺序正确吗?并且比OR有更高的先例,所以AND结合了你的最后两个条件。这就是你想要的吗?如果没有,在你想一起考虑的条件下打一个括号。从你的问题的方式,你可以得到没有结果的结果,而只是WHERE子句,因为匹配其他%或没有%会自动排除那些匹配的%。我相信这并不是那么简单,你需要回答你的问题,并展示你想从样本数据中得到的结果。谢谢你的回答,我对MySQL非常陌生,所以我必须阅读相关的内容。谢谢你的信息!
SELECT `user`
FROM t
WHERE `user` in
(select `user` from t
where `group` LIKE "other%" OR `group` LIKE "none%")
and `user` not in
(select `user` from t
where `group` LIKE "some%")
| USER |
----------
| user-a |
| user-c |
| user-d |
SELECT `user`
FROM t
WHERE (`group` LIKE "other%" OR `group` LIKE "none%")
AND `user` NOT IN (SELECT `user` FROM t WHERE `group` LIKE "some%");
SELECT t.`user`
FROM t
WHERE (t.`group` LIKE "other%" OR t.`group` LIKE "none%")
AND NOT EXISTS
(
SELECT 1 FROM t sub_t
WHERE sub_t.`user` = t.`user`
AND sub_t.`group` LIKE "some%" );
SELECT DISTINCT t1.*
FROM tableName t1
LEFT JOIN tableName t2
ON t1.user_id = t2.user_id
AND t2.group NOT LIKE "some%"
WHERE (t1.group LIKE "other%"
OR t1.group LIKE "none%")
AND t2.user_id IS NULL -- only non-joins
LIMIT 0, 30
select user
from t
group by user
having sum(group LIKE 'other%') > 0 or
(sum(group LIKE 'none%' > 0 and
sum(group like 'some%') = 0
)