以下是该方案:
我有一张看起来像这样的表:
表名:USER_ACTIVITIES
USER_ID | ACTIVITY_CODE
-----------------------
1111 | 013
-----------------------
1111 | 112
-----------------------
2222 | 014
-----------------------
3333 | 028
-----------------------
3333 | 245
-----------------------
3333 | 468
-----------------------
4444 | 079
-----------------------
4444 | 028
-----------------------
5555 | 157
-----------------------
5555 | 523
-----------------------
6666 | 081
-----------------------
7777 | 067
-----------------------
7777 | 624
-----------------------
这是一个使用MySQL的Oracle数据库,ACTIVITY_CODE是一个CHAR字段。我需要提取具有从0开始的ACTIVITY_CODE的USER_ID,并且没有ACTIVITY_CODE以任何其他数字开头。
所以,
WHERE ACTIVITY_CODE LIKE '0%'
给了我所有的USER_ID,其ACTIVITY_CODE从0开始,但也包括USER_ID,其活动代码以0开头,其他ACTIVITY_CODE以其他数字开头。
如何仅返回只有ACTIVITY_CODE以0开头的用户?
我需要它作为单个查询(子查询很好),我无法创建视图。
可以吗?
答案 0 :(得分:0)
使用LEFT JOIN过滤掉与条件不匹配的用户。
SELECT user_id
FROM user_activities ua1
LEFT JOIN (SELECT DISTINCT user_id
FROM user_activities
WHERE activity_code NOT LIKE '0%') ua2
ON ua1.user_id = ua2.user_id
WHERE ua1.activity_code LIKE '0%'
AND ua2.user_id IS NULL
答案 1 :(得分:0)
您也可以通过“不在”并使用正则表达式来完成此操作。
select distinct user_id from user_activities
where activity_code like '0%'
and user_id not in (select user_id
from user_activities
where activity_code REGEXP '^[1..9]')
顺便说一下,你也可以在activity_code上做一个min / max ASCII排序,因为你用0填充它。
所以这将是最简单的查询。
select user_id from user_activities
group by user_id
having min(activity_code) like '0%'
and max(activity_code) like '0%';