2013-11-27 49 views
1

假設我有一個表格,其中材料具有不同特徵的佈局。材料可以具有一個或多個特性。然後,我想找到某種材料類似的材料,這意味着至少有兩個特徵應該匹配。在這個例子中,我應該找到材料C,當我和A比較時,D應該找到B.在SQL中有沒有解決方案?查找具有相同特徵的元素

material | character 
---------------------- 
A   | 2 
A   | 5 
B   | 1 
B   | 3 
B   | 4 
C   | 2 
C   | 5 
D   | 3 
D   | 1 
+0

所以你給一個特定的材料作爲輸入?或者您想要歸還具有共同特徵的所有材料對?你也嘗試過什麼嗎? – OGHaza

+1

SELECT x.m FROM x JOIN y ON y.m <> x.m AND y.c = x.c WHERE y.m = z GROUP BY x.m HAVING COUNT(*)> = 2 – Strawberry

回答

0

您可以使用類似下面的分組表,以確定超過2個相似的特點

SELECT 
    material = t1.material 
    , similarMaterial = t2.material 
FROM 
    tableName t1 
    INNER JOIN tableName t2 ON t1.character = t2.character AND NOT(t1.material = t2.material) 
GROUP BY material 
HAVING 
    COUNT(*) >= 2 
0

這會給你根據材料輸入,結果所有項目:

SELECT b.material 
FROM table1 a 
INNER JOIN table1 b 
    ON a.character = b.character AND a.material <> b.material 
WHERE a.material = 'A' -- Your input 
GROUP BY b.material 
HAVING COUNT(*) > 1; 

sqlfiddle demo

還是這樣做是爲了給你對:

SELECT a.material as LEFT_MATERIAL ,b.material AS RIGHT_MATERIAL 
FROM table1 a 
INNER JOIN table1 b ON a.character = b.character AND a.material <> b.material 
GROUP BY a.material,b.material 
HAVING COUNT(*) > 1; 

sqlfiddle demo

0

是的,你可以找到所有配對與SQL類似這樣的類似材料:

SELECT c1.material, c2.material, COUNT(*) as characterCount 
FROM charateristics c1 
    CROSS JOIN charateristics c2 
WHERE c1.material > c2.material AND c1.character = c2.character 
GROUP BY c1.material, c2.material 
HAVING characterCount >= 2; 
3

這是一個Entity-Attribute-Value表,並且它非常痛苦地搜索。 (在這種情況下,value暗示爲TRUEhas this attribute。)

這涉及比較反對一切的一切,分組結果,並檢查是否羣組符合。幾乎不使用任何類型的索引或智能。

SELECT 
    material_a.material AS material_a, 
    material_b.material AS material_b 
FROM 
    material AS material_a 
LEFT JOIN 
    material AS material_b 
    ON material_a.character = material_b.character 
    AND material_a.material <> material_b.material 
GROUP BY 
    material_a.material, 
    material_b.material 
HAVING 
    0 = MAX(CASE WHEN material_b.character IS NULL THEN 1 ELSE 0 END) 

這使每一個有該material_a具有的特點所有 material_b。
- HAVING子句將檢查材料b的每個0材料a的特性是否缺失。

更改爲INNER JOIN並更改HAVING CLAUSE將獲得share at least two materials

SELECT 
    material_a.material AS material_a, 
    material_b.material AS material_b 
FROM 
    material AS material_a 
INNER JOIN 
    material AS material_b 
    ON material_a.character = material_b.character 
    AND material_a.material <> material_b.material 
GROUP BY 
    material_a.material, 
    material_b.material 
HAVING 
    COUNT(*) >= 2 

無論哪種方式,你仍然是對整個表加入整個表,然後濾出故障。用100種材料,即9,900種材料比較。想象一下,當你有1000個材料,並有999,000比較。或1百萬材料...

+0

我認爲您正在推翻這一項。 – Strawberry

+0

@Strawberry - 可能。你是否有一個「過度思考」的特定方面,你的意思是? – MatBailie

+0

這個返回將被重複嗎?即'A-B B-A' – OGHaza

相關問題