Mysql select查询组concat

标签 mysql group-by group-concat mysql-select-db

我有一个要构建的选择查询,但我无法让它正常工作。我希望从更高级的 MySQL 开发人员那里得到一些建议。 所以我的表是:

 CREATE TABLE IF NOT EXISTS `gv` ( 
`id` int(11) NOT NULL AUTO_INCREMENT,
`option_id` int(11) NOT NULL,
`group_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

INSERT INTO `gv` (`id`, `option_id`, `group_id`) VALUES
(1, 1, 1),
(2, 2, 2),
(3, 3, 2),
(4, 4, 3),
(5, 5, 4),
(6, 6, 4); 

CREATE TABLE IF NOT EXISTS `igv` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `item_id` int(11) NOT NULL,
 `gv_id` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

INSERT INTO `igv` (`id`, `item_id`, `gv_id`) VALUES
(1, 1, 1),
(2, 1, 3),
(3, 2, 1),
(4, 2, 2),
(6, 3, 5),
(7, 4, 2),
(8, 2, 6); 

CREATE TABLE IF NOT EXISTS `items` (
  `item_id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`item_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

INSERT INTO `items` (`item_id`) VALUES
(1),
(2),
(3),
(4),
(5); 

现在我将解释这些表在做什么:

  1. gv 来自 group_values。一个组就像一个项目的属性。例如:颜色。

    • 每行包含一个组的值。例如:红色 ( option_id ) 代表颜色组 ( group_id )。
  2. igv 来自项目组值。项目是我项目中的主要实体,例如产品。

    • 每一行都包含项目和 group_values 之间的关系。例如:红色的元素。
    • 它通过 gv_id ( igv.gv_id = gv.id ) 链接到 gv 表。
  3. items 来自 items :) 我已将此示例简化为只有一列,即 item_id。

我需要查询的内容:

好吧,在我的应用程序中,我有一个选定的项目 ( my_item )(附加了 0 个或多个组值)。 我需要所有定义了完全相同的 group_values 的项目,或者没有为 my_item 组指定值的所有项目。在 php 中,我可以将所有附加的组提取为带有 id 的数组,还有所有 group_values。但是我找不到从这个数据库中选择我需要的东西的方法。 我将非常感谢为这个大量耗时的选择提供的任何输入。

谢谢!

一个简短的草图示例。在左边,我们有匹配所有正确项目的项目(用逗号分隔)。 enter image description here

最佳答案

好的,所以首先我们需要找到一个组与另一个项目匹配的所有项目:

SELECT igv.item_id, sigv.item_id FROM igv
  INNER JOIN gv ON igv.gv_id = gv.id
  INNER JOIN gv sgv ON gv.group_id = sgv.group_id
  INNER JOIN igv sigv ON sigv.gv_id = sgv.id
  WHERE igv.item_id = items.item_id
    AND sigv.item_id = similar.item_id

然后我们只在选项匹配时才感兴趣:

SELECT igv.item_id, sigv.item_id dissimilar FROM igv
  INNER JOIN gv ON igv.gv_id = gv.id
  INNER JOIN gv sgv ON gv.group_id = sgv.group_id
  INNER JOIN igv sigv ON sigv.gv_id = sgv.id
  WHERE igv.item_id = items.item_id
    AND sigv.item_id = similar.item_id
    AND gv.option_id != sgv.option_id

那么我们只对上面选中的项目感兴趣。这可以使用 NOT EXISTSLEFT JOIN 来完成。以下是使用 NOT EXISTS 的方法:

SELECT items.item_id, similar.item_id similar_id
  FROM items similar
  INNER JOIN items
  WHERE items.item_id != similar.item_id
    AND NOT EXISTS (
    SELECT igv.item_id, sigv.item_id dissimilar FROM igv
      INNER JOIN gv ON igv.gv_id = gv.id
      INNER JOIN gv sgv ON gv.group_id = sgv.group_id
      INNER JOIN igv sigv ON sigv.gv_id = sgv.id
      WHERE sigv.item_id = similar.item_id
        AND igv.item_id = items.item_id
        AND gv.option_id != sgv.option_id
    )

结果:

ITEM_ID SIMILAR_ID
1       3
1       5
2       4
2       5
3       1
3       4
3       5
4       2
4       3
4       5
5       1
5       2
5       3
5       4

关于Mysql select查询组concat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12350029/

相关文章:

mysql - group_concat 的使用?

javascript - 使用 Google map 绘制查询的热门结果

php - 警告 : mysql_num_rows() expects parameter 1 to be resource, 中给出的空值(不是 bool 值)

java - 无法在我的另一台电脑上运行相同的 servlet/hibernate 项目

mysql - 如何添加月份列表作为 SQL 条件?

ruby - group_by in rails by 2个或更多属性

java - 为 Jpa 存储库设置 sql_mode=(SELECT REPLACE(@@sql_mode ,'ONLY_FULL_GROUP_BY' ,'' ))

python - 使用 Pandas 计算一组计数的情况

mysql group 通过使用范围记录值

mysql - 仅当其中一个值具有 NULL 字段时,才在表中选择 GROUP_BY 和 GROUP_CONCAT 相同的值