2014-06-12 53 views
0

我有一個表中的主題標籤的mysql:SQL語句得到查找表內的類似記錄

strHash  | nPersonID 
------------------------- 
#dogowner |  1 
#catowner |  1 
#dogowner |  2 
#mouseowner |  3 
#fish  |  3 
#vancouver |  1 
#vancouver |  3 

我想查詢表用MySQL聲明說,我想nPersonID = 1,返回結果的所有人分享一個或多個strHash值。

這將允許我在查看特定人物時顯示類似人物。 (或者,誰有着相似的哈希標籤的人 - 一些但不一定是所有)

+0

沒有,我知道如何讓這個人1,我想說,獲取人1,但是結果會包括其他人strhaash價值... ...所以在上面的例子中,要求人2也將返回人1(因爲他們都擁有dogowner有一個散列,但是,如果我要求人1,我會得到每個人,因爲人與所有其他nPersonID行共享散列值。 –

回答

0

試試這個SQL:

SELECT DISTINCT t2.nPersonID 
FROM table t1 
JOIN table t2 
    ON t1.strHash = t2.strHash 
WHERE t1.nPersonID = 1 
0

的想法:

  • 獲取選中的人的主題標籤
  • 獲取所有擁有相似主題標籤的人
  • 統計有多少標誌匹配

查詢:

SELECT 
    S.nPersonId 
    , COUNT(1) AS SimilarHashCount 
FROM (
     SELECT 
      strHash 
     FROM 
      hashtags 
     WHERE 
      nNersonID = 1 
    ) P 
    INNER JOIN (
     SELECT 
      strHash 
      , nPersonD 
     FROM 
      hashtags 
     WHERE 
      nNersonID != 1 
    ) S 
     ON P.strHash = S.strHash 
GROUP BY 
    S.nPersonID 
ORDER BY 
    COUNT(1) DESC 

您可以限制的結果,或者您可以使用HAVING語句來篩選結果

1

最簡單的方法得到的只是一個人的列表份額hastags與人1是這樣的:

SELECT DISTINCT nPersonID 
FROM table 
WHERE strHash IN (
    SELECT b.strHash 
    FROM table b 
    WHERE b.nPersonID=1 
) 

但是,你可以得到一些額外的信息,而不會讓事情太複雜。 例如,下面的查詢會列出同一人,但也給你的這些人的井號標籤的相似程度的那些人1量詞:

SELECT nPersonID, COUNT(DISTINCT strHash) AS shared_hashtags 
FROM table 
WHERE strHash IN (
    SELECT b.strHash 
    FROM table b 
    WHERE b.nPersonID=1 
) 
GROUP BY nPersonID 
ORDER BY shared_hashtags DESC 

這將選擇所有具有一個或一個以上的人#1人擁有的主題標籤...包括人1。

調用列表將按常見的hastags數量排序......與排名最靠前的人(包括人1)排序。

0

許多方法來實現這一點。如果你希望得到的結果,而不標識「1」(請求ID)我會用下面的查詢

SELECT DISTINCT [nPersonID] 
    FROM [htag] 
    where strHash in (select strHash FROM [htag] where [nPersonID] = 1) 

這將輸出如下

nPersonID 
1 
2 
3 

做添加另一個條件

SELECT DISTINCT [nPersonID] 
    FROM [htag] 
    where strHash in (select strHash FROM [htag] where [nPersonID] = 1) 
    and [nPersonID] != 1 

輸出:

nPersonID 
2 
3 

希望這可以幫助!

0
SELECT *, COUNT(*) FROM XXX GROUP BY strHash HAVING COUNT(*) > 1 

這個問題已經被問過 - How to select non "unique" rows

答案以上屬於judda(有點修改)