【问题标题】:How to identify unique items within a dataset defined by different attributes?如何识别由不同属性定义的数据集中的唯一项目?
【发布时间】:2018-12-19 23:21:40
【问题描述】:

我有以下项目数据集

项目:

item
i1
i2
i3
i4

属性

item | attribute | attr_group
i1     green       color
i2     red         color
i1     fancy       style
i2     cool        style
i4     purple      color
i3     red         color
i1     REF1        refid
i2     REF2        refid
i3     REF2        refid
i4     REF1        refid

属性组名称

attr | group
a1     color
a2     style
a3     refid

文章:

article_id | title ..
ref1_1
ref1_2
ref2

现在我想用article_id 标识的唯一项目填充表格文章。唯一项定义为具有 refid 的项,该 refid 要么没有属性,要么具有不止一种不同的颜色。

例如ref1 有两个项目(绿色和紫色)​​,因此 ref1 本身不能唯一,但会有 2 个 article_id:ref1_1 和 ref1_2。

带有ref2的item颜色相同,所以只定义了一个article_id。

一个可能的 MySQL 查询如何选择唯一的项目并将它们插入到表文章中?我无法解决这个问题,非常感谢任何帮助。

我最好的尝试看起来像下面的 SQL 查询,但是它只会根据 ref_id 和颜色定义文章,缺少的是具有所有相同颜色的项目。

/* create unique articles */
INSERT
IGNORE INTO articles (article_id, URL, ref_id, cat_id, dial_id)
SELECT CONCAT ( a.value, '-', a2.value) AS article_id,
       CONCAT ( cs.name_safe, '-', LOWER(ca.attr_de), '-r', a.value) AS URL,
       a.value AS refid,
       cs.ID,
       a2.value AS color_id
FROM `classifieds_attr` a
INNER JOIN classifieds c ON c.ID = a.cl_id
INNER JOIN cat_names_sub cs ON c.cat_id = cs.ID
INNER JOIN `classifieds_attr` a2 ON c.ID = a2.cl_id
AND a2.attr_group_id = 9
INNER JOIN cat_attr ca ON a2.value = ca.attr_id
WHERE a.attr_group_id = 8
  AND cs.cat_main_id = 15
  AND a2.value NOT LIKE 'Invalid:%'
GROUP BY refid,color_id

【问题讨论】:

  • StackOverflow 不是免费的编码服务。所以希望你try to solve your own problem first。请更新您的问题以在minimal reproducible example 中显示您已经尝试过的内容。如需更多信息,请参阅How to Ask,并拨打tour :)
  • 我不明白 attr 列的意义
  • @Barmar 感谢您的反馈,这是一项相当复杂的任务,我眼中的困难在于我卡住的逻辑,并希望从更有经验的开发人员那里获得一些帮助或输入。我已经为这个问题添加了我最好的镜头。
  • 有很多关于编写 SQL 查询来处理这样的属性值表的问题。您可能无法找到直接回答您问题的答案,但您应该学习使用它们的一般技巧。然后,您应用您的编程专业知识来为您的特定问题提出解决方案。这就是编程——这是一个创造性的过程,而不是“用数字绘画”。

标签: mysql sql


【解决方案1】:

获取物品并不难:

SELECT a.item
FROM attributes a
GROUP BY a.item
HAVING sum(attr_group = 'refid') > 0 AND
       (sum(attr_group = 'refid') = count(*) OR -- only a refid
        min(CASE WHEN attr_group = 'color' THEN attribute END) <>
        max(CASE WHEN attr_gruop = 'color' THEN attribute END)
       );

我不确定如何将这些变成“文章”,但这可能是您需要的。

【讨论】:

  • 有趣的方法。然而,这是假设项目总是带有属性列表,但事实并非如此。所有的item都在table items中,只有有attributes才会有table attributes中的entry。
  • @merlin 。 . .如果他们有resid,他们就有一个属性。而且你需要残渣。
  • 你说得对,没想到。我试图调整您的查询,但结果不是我正在寻找的结果。我怎样才能更好地说明这个案例?有没有像 jsfiddle 这样我可以上传一些示例数据的东西?
猜你喜欢
  • 2021-05-22
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 2015-07-11
  • 2017-05-01
相关资源
最近更新 更多