使用MySQL,使用第二列作为条件,在具有重复ID的表中返回特定用户ID

时间:2013-07-11 02:21:19

标签: mysql

以下是该方案:

我有一张看起来像这样的表:

表名: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开头的用户?

我需要它作为单个查询(子查询很好),我无法创建视图。

可以吗?

2 个答案:

答案 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]')

SQL Fiddle

顺便说一下,你也可以在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%';

Second SQL Fiddle Example