如何在MySQL中查询产品和过滤器之间的多对多关系?

萨钦

我有三张桌子,也就是。tb_filters,tb_products和tb_products_to_filters。这些表的结构以及一些伪数据由下式给出:

tb_filters:

CREATE TABLE IF NOT EXISTS `tb_filters`
(
    `filter_id` INT (11) AUTO_INCREMENT PRIMARY KEY,
    `filter_name` VARCHAR (255)
);

INSERT INTO `tb_filters`
(`filter_name`)
VALUES ('USB'),
('High Speed'),
('Wireless'),
('Ethernet');

在此处输入图片说明

tb_products:

CREATE TABLE IF NOT EXISTS `tb_products`
(
    `product_id` INT (11) AUTO_INCREMENT PRIMARY KEY,
    `product_name` VARCHAR (255)
);

INSERT INTO `tb_products`
(`product_name`)
VALUES ('Ohm precision shunt resistor'),
('Orchestrator Libraries'),
('5cm scanner connection'),
('Channel isolated digital'),
('Network Interface Module');

在此处输入图片说明

tb_products_to_filters:

CREATE TABLE IF NOT EXISTS `tb_products_to_filters`
(
    `id` INT (11) AUTO_INCREMENT PRIMARY KEY,
    `product_id` INT (11),
    `filter_id` INT (11)
);

INSERT INTO `tb_products_to_filters`
(`product_id`, `filter_id`)
VALUES (1, 1),
(2, 2),
(3, 3),
(4, 3),
(1, 3);

在此处输入图片说明

通过查看上面的“ tb_products_to_filters”表,我需要的查询是:

通过页面上的复选框选择过滤器ID = 1和3时,必须从数据库中获取所有属于过滤器ID 1和过滤器ID 3的产品。在这种情况下,ID为1的产品应该会出现。

其次,仅检查一个过滤器(例如id = 3)时,应提取所有属于该id的产品。在这种情况下,产品ID 1、3和4将会出现。

如果选择了过滤器ID 2,则只会出现ID = 2的一种产品。

如果选择了过滤器(2和3)的组合,则将不会有任何产品出现,因为没有属于这两个产品的产品。

为达到上述目标而编写查询的方式是什么?

请注意,我要包括以下列:product_id,product_name,filter_id和filter_name,以在表结果集中显示数据。

编辑:

检查过滤器ID 1和3时,输出应匹配以下内容:

在此处输入图片说明

编辑2:

我正在尝试查询以下查询以获取检查过滤器1和3的结果:

SELECT `p`.`product_id`, `p`.`product_name`, 
GROUP_CONCAT(DISTINCT `f`.`filter_id` ORDER BY `f`.`filter_id` SEPARATOR ', ') AS filter_id, GROUP_CONCAT(DISTINCT `f`.`filter_name` ORDER BY `f`.`filter_name` SEPARATOR ', ') AS filter_name 
FROM `tb_products` AS `p` INNER JOIN `tb_products_to_filters` AS `ptf` 
ON `p`.`product_id` = `ptf`.`product_id` INNER JOIN `tb_filters` AS `f` 
ON `ptf`.`filter_id` = `f`.`filter_id` GROUP BY `p`.`product_id` 
HAVING GROUP_CONCAT(DISTINCT `ptf`.`filter_id` SEPARATOR ', ') = ('1,3') 
ORDER BY `p`.`product_id`

但不幸的是,它返回一个空集。为什么?

萨加斯

您可以将HAVING子句与结合使用GROUP_CONCAT

SELECT t.product_id,tp.product_name,
       GROUP_CONCAT(t.filter_id) as filter_id,
       GROUP_CONCAT(tb.filter_name) as filter_name
FROM tb_products_to_filters t
INNER JOIN tb_filters tb ON(t.filter_id = tb.filter_id)
INNER JOIN tb_products tp ON(t.product_id = tp.product_id)
WHERE t.filter_id IN(1,3)
GROUP BY t.product_id
HAVING COUNT(distinct t.filter_id) = 2

您可以根据需要进行任何调整。请注意,放在中的参数数量IN()应与COUNT(..) = X

编辑:

提取这些列时,在GROUP_CONCAT中需要使用DISTINCT关键字,否则所有过滤器都会出现在列表中。我尝试过

SELECT t.product_id,tp.product_name,
       GROUP_CONCAT(DISTINCT t.filter_id ORDER BY `t`.`filter_id` SEPARATOR ', ') as filter_id,
       GROUP_CONCAT(DISTINCT tb.filter_name ORDER BY tb.filter_name SEPARATOR ', ') as filter_name
FROM tb_products_to_filters t
INNER JOIN tb_filters tb ON(t.filter_id = tb.filter_id)
INNER JOIN tb_products tp ON(t.product_id = tp.product_id)
WHERE t.filter_id IN(1,3)
GROUP BY t.product_id
HAVING COUNT(distinct t.filter_id) = 2

但是,所有过滤器名称(以太网,高速,USB,无线)仍在列表中。如何仅列出字符串中具有相应过滤器ID(1、3)的那些过滤器名称?

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在 ReactJS 中的两个表单过滤器之间建立依赖关系

来自分类Dev

ElasticSearch中的查询和过滤器之间的区别

来自分类Dev

如何在Django中过滤多对多关系

来自分类Dev

如何在父母和孩子之间共享过滤器

来自分类Dev

如何在父母和孩子之间共享过滤器

来自分类Dev

如何在Oracle中获取多对多关系查询?

来自分类Dev

如何在 Laravel 中查询逆多对多关系

来自分类Dev

在MySql中查询多对多关系

来自分类Dev

如何在查询中包装ElasticSearch过滤器

来自分类Dev

如何在查询中包装ElasticSearch过滤器

来自分类Dev

如何在SQL查询中按过滤器计数?

来自分类Dev

如何在 morphia 中为过滤器编写查询

来自分类Dev

如何在Elasticsearch中运行查询和过滤器的组合?

来自分类Dev

SQLAlchemy:多对多关系查询中的过滤计数

来自分类Dev

如何查询多对多关系?

来自分类Dev

如何在Flask SQL Alchemy中查询一对多/多对多关系?

来自分类Dev

如何在“ woocommerce_product_get_weight”过滤器中获取产品ID?

来自分类Dev

如何在Ruby on Rails中构建仅在has_many关系的最大值上联接并在该关系上包括选择过滤器的查询?

来自分类Dev

Elasticsearch范围查询和范围过滤器之间的区别

来自分类Dev

如何在Laravel中的多对多关系中基于额外的外键过滤响应?

来自分类Dev

MySQL过滤器查询?

来自分类Dev

MySQL过滤器查询

来自分类Dev

MySQL从多对多关系中过滤许多元素

来自分类Dev

如何在模型或过滤器中存储多菌落域的计数并聚合多菌落域

来自分类Dev

MongoDB-linq中包含不受支持的过滤器。如何在Linq查询中使用contains和ToLower?

来自分类Dev

带过滤器的elasticsearch中的多词查询

来自分类Dev

Laravel 查询过滤器审查与关系

来自分类Dev

您如何在ffmpeg中订购过滤器有关系吗?

来自分类Dev

如何在jquery内容中连接两个过滤器?过滤器 1 和过滤器 2 连接结果

Related 相关文章

  1. 1

    如何在 ReactJS 中的两个表单过滤器之间建立依赖关系

  2. 2

    ElasticSearch中的查询和过滤器之间的区别

  3. 3

    如何在Django中过滤多对多关系

  4. 4

    如何在父母和孩子之间共享过滤器

  5. 5

    如何在父母和孩子之间共享过滤器

  6. 6

    如何在Oracle中获取多对多关系查询?

  7. 7

    如何在 Laravel 中查询逆多对多关系

  8. 8

    在MySql中查询多对多关系

  9. 9

    如何在查询中包装ElasticSearch过滤器

  10. 10

    如何在查询中包装ElasticSearch过滤器

  11. 11

    如何在SQL查询中按过滤器计数?

  12. 12

    如何在 morphia 中为过滤器编写查询

  13. 13

    如何在Elasticsearch中运行查询和过滤器的组合?

  14. 14

    SQLAlchemy:多对多关系查询中的过滤计数

  15. 15

    如何查询多对多关系?

  16. 16

    如何在Flask SQL Alchemy中查询一对多/多对多关系?

  17. 17

    如何在“ woocommerce_product_get_weight”过滤器中获取产品ID?

  18. 18

    如何在Ruby on Rails中构建仅在has_many关系的最大值上联接并在该关系上包括选择过滤器的查询?

  19. 19

    Elasticsearch范围查询和范围过滤器之间的区别

  20. 20

    如何在Laravel中的多对多关系中基于额外的外键过滤响应?

  21. 21

    MySQL过滤器查询?

  22. 22

    MySQL过滤器查询

  23. 23

    MySQL从多对多关系中过滤许多元素

  24. 24

    如何在模型或过滤器中存储多菌落域的计数并聚合多菌落域

  25. 25

    MongoDB-linq中包含不受支持的过滤器。如何在Linq查询中使用contains和ToLower?

  26. 26

    带过滤器的elasticsearch中的多词查询

  27. 27

    Laravel 查询过滤器审查与关系

  28. 28

    您如何在ffmpeg中订购过滤器有关系吗?

  29. 29

    如何在jquery内容中连接两个过滤器?过滤器 1 和过滤器 2 连接结果

热门标签

归档