Mysql 查找具有相同特征的元素

Mysql 查找具有相同特征的元素,mysql,sql,select,relational-division,Mysql,Sql,Select,Relational Division,假设我有一张桌子,一种材料有不同的特性。材质可以具有一个或多个特性。然后我想找到一种与某种材料相似的材料,这意味着至少有两种特性应该匹配。在这个例子中,当我与A比较时,我应该找到材料C,而D应该找到B。SQL中有什么解决方案吗 material | character ---------------------- A | 2 A | 5 B | 1 B | 3 B | 4 C

假设我有一张桌子,一种材料有不同的特性。材质可以具有一个或多个特性。然后我想找到一种与某种材料相似的材料,这意味着至少有两种特性应该匹配。在这个例子中,当我与A比较时,我应该找到材料C,而D应该找到B。SQL中有什么解决方案吗

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

您可以使用下面的分组表来确定具有两个以上相似特征的所有项目

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

这将为您提供基于材料输入的结果:

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;
或者这样做,为您提供配对:

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;

是的,您可以找到与以下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;

这是一个实体属性值表,搜索起来非常痛苦。在本例中,对于具有此属性的对象,该值被暗示为TRUE

它包括将所有内容与所有内容进行比较,对结果进行分组,并检查各组是否匹配。实际上没有使用任何类型的索引或智能

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)

不管是哪种方式,您仍然将整个表与整个表连接起来,然后过滤掉失败。有100种材料,这是9900种材料的比较。想象一下,当您有1000种材质和999000种比较时。或者100万种材料…

那么你要提供一种特定的材料作为输入?还是要返回所有具有相同特征的材质对?你也试过什么吗?从x中选择x.m,在y.m x.m上加入y,y.c=x.c,其中y.m=z,按x.m分组,计数*>=2我认为你想得太多了。@草莓-可能吧。你是否有一个特别的方面,你的意思是过度思考?这个回报会重复吗?i、 e.A-B-A@OGHaza-是的。在保证将联接更改为和material_a.materialSELECT 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