2012-10-24 22 views
1

我有了兩個列的SQLite表稱爲匹配列匹配:列1和列2包含整數值:SQLite的選擇和分組跨

column1 column2 
------------------ 

5   6 
6   8 
8   9 
90   91 
1   20 
10   20 

我想匹配在任一列中發現重複的號碼,加入他們的行列包括比賽第二個值,讓自己的搜索結果中的回報將是:

5, 6, 8, 9 
1, 20, 10 

(不包括通知,90和91都沒有比賽,因此)。

我的「猜測」在做這樣的:

SELECT column1, column2 
FROM match 
WHERE column2 
IN (SELECT column1 
    FROM match 
    GROUP BY column1 HAVING (COUNT(column1) > 0)) 
    UNION 
    SELECT column1, column2 
    FROM match 
    WHERE column1 
    IN (SELECT column2 
     FROM match 
     GROUP BY column1 HAVING (COUNT(column2) > 0)) 
     UNION 
     SELECT column1, column2 
     FROM match 
     WHERE column1 
     IN (SELECT column1 
      FROM match 
      GROUP BY column1 HAVING (COUNT(column1) > 1)) 
      UNION 
      SELECT column1, column2 
      FROM match 
      WHERE column2 
      IN (SELECT column2 
       FROM match 
       GROUP BY column2 HAVING (COUNT(column2) > 1)) 

,結果幾乎是我所需要的:

5 6 
6 8 
8 9 
1 20 
10 20 

但我真正需要的是有結果不知何故分組。例如:

(5,6,8,9)(1,10,20)

這是可能的?而我的SQL嘗試是否過於複雜?

+0

有沒有最大限度的多少可以找到相匹配?我並不認爲這種邏輯應該在數據庫層完成。 –

+0

如果你的規則是有匹配的,爲什麼1,5,9和10會得到你想要的結果? – invertedSpear

+0

哦,我現在明白了,如果兩個數字都匹配,就需要整個記錄。 – invertedSpear

回答

1

我想這是你想要什麼:http://sqlfiddle.com/#!7/05747/9

SELECT column1 as newColumn 
FROM match WHERE column1 in (

SELECT myColumn 
FROM(

SELECT count(*) as cnt, myColumn 
FROM (
SELECT column1 as myColumn 
FROM match 
UNION ALL 
SELECT column2 as myColumn 
FROM match 
) x 
GROUP BY myColumn 
HAVING cnt > 1 
) y 
) OR column2 in (
SELECT myColumn 
FROM(

SELECT count(*) as cnt, myColumn 
FROM (
SELECT column1 as myColumn 
FROM match 
UNION ALL 
SELECT column2 as myColumn 
FROM match 
) x 
GROUP BY myColumn 
HAVING cnt > 1 
) y 
) 
UNION 
SELECT column2 as newColumn 
FROM match WHERE column1 in (

SELECT myColumn 
FROM(

SELECT count(*) as cnt, myColumn 
FROM (
SELECT column1 as myColumn 
FROM match 
UNION ALL 
SELECT column2 as myColumn 
FROM match 
) x 
GROUP BY myColumn 
HAVING cnt > 1 
) y 
) OR column2 in (
SELECT myColumn 
FROM(

SELECT count(*) as cnt, myColumn 
FROM (
SELECT column1 as myColumn 
FROM match 
UNION ALL 
SELECT column2 as myColumn 
FROM match 
) x 
GROUP BY myColumn 
HAVING cnt > 1 
) y 
) 
+0

謝謝。這很有用,但我想讓我的問題更清楚一點:(5,6,8,9)是一個組(或一組),因爲它們有共同之處,因爲它們具有在列1或列2中通用的數字。 (1,10,20)也是一個組(或集合),因爲它們在列1或列2中也有共同的數字。我的目標是根據此規則對搜索結果進行分組。 –

+0

我不確定您是否可以用所提供的數據在邏輯上做到這一點。我不知道你的餐桌設計實際上是什麼,但我現在想知道,如果這個問題可能被破解,首先檢查你是如何存儲數據,並確定是否有一些變化可能使這更可行。或者像KDiTraglia說的那樣,也許數據庫層不是解決這個問題的正確的地方。 – invertedSpear