0

这是场景:

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

表名: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 并且没有以任何其他数字开头的 ACTIVITY_CODE 的 USER_ID。

所以,

WHERE ACTIVITY_CODE LIKE '0%'

给我所有具有以 0 开头的 ACTIVITY_CODE 的 USER_ID,但还包括具有以 0 开头的活动代码和以其他数字开头的其他 ACTIVITY_CODE 的 USER_ID。

如何只返回只有 ACTIVITY_CODE 以 0 开头的用户?

我需要它是一个查询(子查询很好),我不能创建视图。

可以做到吗?

4

2 回答 2

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
于 2013-07-11T02:30:36.243 回答
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小提琴

戴上我的帽子,你也可以简单地对activity_code进行最小/最大ASCII排序,因为你已经用0填充了它。

所以这将是最简单的查询。

select user_id from user_activities
  group by user_id
  having min(activity_code) like '0%'
    and max(activity_code) like '0%';

第二个 SQL Fiddle 示例

于 2013-07-11T02:36:06.880 回答