假设我有一张桌子,一种材料有不同的特性。一种材料可以有一个或多个特性。然后我想找一种与某一材料相似的材料,也就是说至少有两种特性应该匹配。在这个例子中,我应该在与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

最佳答案

这是一个实体属性值表,搜索起来非常痛苦。(在这种情况下,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)

这使得每一种材料都具有材料所具有的所有特性。
-HAVING子句将检查材料b中是否缺少材料a特性的每个0
更改为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种材料,这是9900种材料的比较。想象一下,当你有1000种材料和99.9万种比较时。或者一百万的材料。。。

关于mysql - 查找具有相同特征的元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20245933/

10-16 14:57