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
       )