2013-07-11 36 views
0

這裏的情景:使用MySQL,返回特定用戶ID的表中的重複的ID的使用第二列作爲標準

我有一個表,看起來是這樣的:

表名: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%' 

給我的一切,都從0開始的ACTIVITY_CODE,而且還包括了USER_ID的有活動代碼從0開始和其他ACTIVITY_CODE的開始與其他號碼USER_ID的。

如何返回只有ACTIVITY_CODE以0開頭的用戶?

我需要它是一個單一的查詢(子查詢很好),我不能創建視圖。

可以這樣做嗎?

回答

0

你也可以通過'Not in'和使用正則表達式來做到這一點。

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最小/最大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

+0

優秀的解決方案。我特別喜歡最小/最大解決方案。謝謝你的幫助。兩種解決方案都很完美 – anbisme

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 
+0

該解決方案爲我的歡迎,並反映瞭解決其他人拿出的訪問,所以它可能是最容易讓他們即時掌握。謝謝你的幫助。 – anbisme

相關問題