2013-03-24 81 views
1

我有一個問題,我似乎無法解決。我有一張跟蹤用戶ID和應用ID的表格。該表是這樣的:返回匹配值,排除那些不匹配的,刪除重複項MYSQL

Library: 
ID  userID  appID 
1   1   11122    
2   1   65324 
3   1   43435 
4   2   43435 
5   2   50645 
6   2   34343 
7   4   11122 
8   4   55343 

查詢應做到以下幾點:

  • 返回所選擇的用戶有共同所有的appid值。 (如果用戶4和用戶1被選中並且都具有應用程序11122,它應該顯示應用程序11122)
  • 排除不匹配的那些(刪除它們沒有共同的那些,在本例中它將是刪除IDS(55343,65324和43435)
  • 刪除重複的結果(這不應該列出相同的應用程序的兩倍。所以APPID 11122應該只顯示一次)

這裏有我想要的PHP示例做:

$array1 = array("a" => "green", "red", "blue"); 
    $array2 = array("b" => "green", "yellow", "red"); 
    $result = array_intersect($array1, $array2); 

結果將是「綠色」和「紅色」

這是可能通過MySQL嗎?

+0

我試過幾個不同的東西。其中之一「SELECT DISTINCT appID從庫WHERE userID = 1或userID = 2」,但是此查詢顯示不符合兩個用戶的。還有一個我發現的UNION ALL查詢,但它似乎不是我的問題的解決方案。 – roadrunner 2013-03-24 01:17:27

回答

0

你可以試試這個:

select a.appID from Library a 
inner join 
(select appID,count(ID) as ctr from Library where userID in(1,4) group by appID) b on b.appID = a.appID 
where b.ctr > 1 
group by a.appID; 

sql fiddle

更新:

我不知道,如果你想查看的共同用戶ID爲1列只

select a.appID,group_concat(a.userID) as user_ids from Library a 
inner join 
(select appID,count(ID) as ctr from Library where userID in(1,4) group by appID) b on b.appID = a.appID 
where b.ctr > 1 
group by a.appID; 

SQL Fiddle

+0

謝謝!這幾乎是我需要的。它在「WHERE userID IN」語句中有兩個用戶標識時有效,但不止是它不顯示通用結果。它看起來像先採用最常見的ID,而沒有過濾掉其餘的。不知道這是否有道理。 – roadrunner 2013-03-24 06:07:53

+0

非常感謝約瑟夫!你是一個超級英雄。 – roadrunner 2013-03-24 18:16:10

0

我不積極我完全理解你的問題,但它聽起來像你想返回用戶ID 1和2,因爲它們與相同的appID(實際上是兩次)相關聯。如果是這樣,那麼這應該工作:

select L.userID, L.appID 
from Library L 
    join (
     select appID 
     from Library 
     group by appId 
     having count(distinct userID) > 1 
) L2 on L.appID = L2.appID 

SQL Fiddle Demo

如果你只需要獨特的用戶ID,從上面的查詢中刪除應用標識,並添加DISTINCT。