【问题标题】:How to count products to multiple filters如何将产品计数到多个过滤器
【发布时间】:2020-11-03 20:54:53
【问题描述】:

更新

我喜欢制作像 Online Shop 这样的产品过滤器模块,当您单击其中一个过滤器以计算其他过滤器中的当前产品时

例如,如果这是前端并且它们是复选框并且它们是未选中的 atm

Size (group_id)
  10m (option_id: 52) (21 products)
  20m (option_id: 51) (1 product)

Color (group_id)
   Green (option_id: 49) (22 products)
   Black (option_id: 38) (1 product)

如果用户选择 10m (option_id: 52) 过滤器计数器应该变成这样

Size (group_id)
  10m (option_id: 52) (21 products)
  20m (option_id: 51) (1)

Color (group_id)
   Green (option_id: 49) (2)
   Black (option_id: 38) (0)

我制作了一张表,仅用于计算我保留 group_id、option_id、product_id、category_id、manufacturer_id 的位置

我查询要过滤的产品数量,但问题是我无法返回同一类别中的其他过滤器计数器(option_id:38)和同一类别中所有制造商的制造商计数器,有什么想法吗?

SELECT sd.*, COUNT(sd.product_id) FROM filter_counter sd WHERE sd.product_id IN (SELECT c.product_id FROM filter_counter c WHERE c.option_id IN (52) AND c.category_id = 127) AND sd.category_id = 127 GROUP BY sd.option_id

CREATE TABLE `filter_counter` (
  `id` int(11) NOT NULL,
  `group_id` int(11) NOT NULL,
  `option_id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  `category_id` int(11) NOT NULL,
  `manufacturer_id` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `filter_counter` (`id`, `group_id`, `option_id`, `product_id`, `category_id`, `manufacturer_id`) VALUES
(1, 33, 52, 5124, 65, 36),
(2, 33, 52, 5124, 127, 36),
(3, 33, 52, 5125, 65, 36),
(4, 33, 52, 5125, 127, 36),
(5, 33, 52, 5138, 65, 36),
(6, 33, 52, 5138, 127, 36),
(7, 33, 52, 5141, 65, 36),
(8, 33, 52, 5141, 127, 36),
(9, 33, 52, 5146, 65, 36),
(10, 33, 52, 5146, 127, 36),
(11, 33, 52, 5147, 65, 36),
(12, 33, 52, 5147, 127, 36),
(13, 33, 52, 5148, 65, 36),
(14, 33, 52, 5148, 127, 36),
(15, 33, 52, 5149, 65, 36),
(16, 33, 52, 5149, 127, 36),
(17, 33, 52, 5150, 65, 36),
(18, 33, 52, 5150, 127, 36),
(19, 33, 52, 5151, 65, 36),
(20, 33, 52, 5151, 127, 36),
(21, 33, 52, 5152, 65, 36),
(22, 33, 52, 5152, 127, 36),
(23, 33, 52, 5153, 65, 36),
(24, 33, 52, 5153, 127, 36),
(25, 33, 52, 5154, 65, 36),
(26, 33, 52, 5154, 127, 36),
(27, 33, 52, 5155, 65, 36),
(28, 33, 52, 5155, 127, 36),
(29, 33, 52, 5156, 65, 36),
(30, 33, 52, 5156, 127, 36),
(31, 33, 52, 5157, 65, 36),
(32, 33, 52, 5157, 127, 36),
(33, 33, 52, 7042, 65, 38),
(34, 33, 52, 7042, 127, 38),
(35, 33, 52, 7048, 65, 38),
(36, 33, 52, 7048, 127, 38),
(37, 33, 52, 7124, 65, 0),
(38, 33, 52, 7124, 127, 0),
(39, 32, 49, 7185, 65, 0),
(40, 32, 49, 7185, 127, 0),
(41, 32, 49, 7517, 65, 39),
(42, 32, 49, 7517, 127, 39),
(43, 32, 49, 7518, 65, 39),
(44, 32, 49, 7518, 127, 39),
(45, 32, 49, 7538, 65, 39),
(46, 32, 49, 7538, 127, 39),
(47, 32, 49, 7657, 65, 39),
(48, 32, 49, 7657, 127, 39),
(49, 32, 49, 7658, 65, 39),
(50, 32, 49, 7658, 127, 39),
(51, 32, 49, 7797, 65, 21),
(52, 32, 49, 7797, 127, 21),
(53, 32, 49, 7798, 65, 21),
(54, 32, 49, 7798, 127, 21),
(55, 32, 49, 7799, 65, 21),
(56, 32, 49, 7799, 127, 21),
(57, 32, 49, 7800, 65, 21),
(58, 32, 49, 7800, 127, 21),
(59, 32, 49, 7801, 65, 21),
(60, 32, 49, 7801, 127, 21),
(61, 32, 49, 7802, 65, 21),
(62, 32, 49, 7802, 127, 21),
(63, 32, 49, 7803, 65, 21),
(64, 32, 49, 7803, 127, 21),
(65, 32, 49, 7804, 65, 21),
(66, 32, 49, 7804, 127, 21),
(67, 32, 49, 7805, 65, 21),
(68, 32, 49, 7805, 127, 21),
(69, 32, 49, 7806, 65, 21),
(70, 32, 49, 7806, 127, 21),
(71, 32, 49, 7807, 65, 21),
(72, 32, 49, 7807, 127, 21),
(73, 32, 49, 7808, 65, 21),
(74, 32, 49, 7808, 127, 21),
(75, 32, 49, 7809, 65, 21),
(76, 32, 49, 7809, 127, 21),
(77, 32, 49, 7810, 65, 21),
(78, 32, 49, 7810, 127, 21),
(79, 29, 38, 7811, 65, 21),
(80, 29, 38, 7811, 127, 21),
(81, 32, 49, 8020, 65, 21),
(82, 32, 49, 8020, 127, 21),
(83, 33, 52, 8020, 65, 21),
(84, 33, 52, 8020, 127, 21),
(85, 32, 49, 8021, 65, 21),
(86, 32, 49, 8021, 127, 21),
(87, 33, 51, 8021, 65, 21),
(88, 33, 51, 8021, 127, 21),
(89, 33, 52, 8021, 65, 21),
(90, 33, 52, 8021, 127, 21);


My database and query example

【问题讨论】:

  • 你能把你的文字写得更简洁吗?我想帮忙,但无法理解您的问题
  • 例如,如果我有一个 product_id 8020 和两个选项(options_id 49 和 52),当用户选择选项 49 时,计数必须在选项 49 中显示 1 个产品,在选项 52 中显示 1 个产品 完全不清楚... 为什么产品 8021 被忽略?为什么选项 52 被计数而用户没有选择它?
  • @CasperDijkstra 我更新问题
  • @Akina 我更新问题
  • 你可以尝试在 group by 子句中添加 sd.Product_id

标签: mysql


【解决方案1】:

例如,如果这是前端并且它们是复选框并且它们是未选中的 atm

Size (group_id)
 10m (option_id: 52) (21 products)
 20m (option_id: 51) (1 product)

Color (group_id)
  Green (option_id: 49) (22 products)
  Black (option_id: 38) (1 product)
SELECT COUNT(DISTINCT CASE WHEN option_id = 52 THEN product_id END) p52,
       COUNT(DISTINCT CASE WHEN option_id = 51 THEN product_id END) p51,
       COUNT(DISTINCT CASE WHEN option_id = 49 THEN product_id END) p49,
       COUNT(DISTINCT CASE WHEN option_id = 38 THEN product_id END) p38
FROM filter_counter;

如果用户选择 10m (option_id: 52) 过滤器计数器应该变成这样

Size (group_id)
 10m (option_id: 52) (21 products)
 20m (option_id: 51) (1)

Color (group_id)
  Green (option_id: 49) (2)
  Black (option_id: 38) (0)
SELECT COUNT(DISTINCT CASE WHEN option_id = 52 THEN product_id END) p52,
       COUNT(DISTINCT CASE WHEN option_id = 51 THEN product_id END) p51,
       COUNT(DISTINCT CASE WHEN option_id = 49 THEN product_id END) p49,
       COUNT(DISTINCT CASE WHEN option_id = 38 THEN product_id END) p38
FROM filter_counter
JOIN ( SELECT DISTINCT product_id
       FROM filter_counter
       WHERE option_id IN (52) ) filter1 USING (product_id);

fiddle

如果用户检查同一组中的其他过滤器,则将下一个值添加到条件中。例如,如果他检查与option_id = 52 在同一组中的option_id = 51,则过滤子查询变为

JOIN ( SELECT DISTINCT product_id
       FROM filter_counter
       WHERE option_id IN (52, 51) ) filter1 USING (product_id)

如果用户检查另一个组中的附加过滤器,则添加附加 filterX 子查询。例如,如果他检查option_id = 49,那么下一个子查询会添加到查询中:

JOIN ( SELECT DISTINCT product_id
       FROM filter_counter
       WHERE option_id IN (49) ) filter2 USING (product_id)

有什么方法可以让每行输出一个吗?

SELECT options.option_id,
       COUNT(DISTINCT CASE WHEN filter_counter.option_id = options.option_id 
                           THEN product_id 
                           END) option_count
FROM filter_counter
CROSS JOIN ( SELECT DISTINCT option_id
             FROM filter_counter ) options
JOIN ( SELECT DISTINCT product_id
       FROM filter_counter
       WHERE option_id IN (52) ) filter1 USING (product_id)
GROUP BY options.option_id;

fiddle

【讨论】:

  • 感谢您的帮助,这几乎就是我所寻找的,只有输出结果不适合我的代码,有什么方法可以让每行输出一个吗?像这个sqlfiddle.com/#!9/2239a0/1,我真的不知道如何修改你的查询变成这样
  • @Ivan 有什么方法可以让每行输出一个吗?已更新。
  • 我现在注意到,如果您选择 option_id 51 将更新 option_id 52 的计数,但它们在同一个组中,不应该像用户想要查看 10m 和 20m 的产品那样更新,我将显示 21 个产品从 option_id 52 和 1 到 option_id 51 ,如果您选择屏幕尺寸argos.co.uk/browse/technology/televisions-and-accessories/… ,就像这里的链接一样有可能吗?因为我尝试添加 AND group_id != 33 但不工作
  • 如果您选择 option_id 51 将更新 option_id 52 的计数 我不明白这句话。在小提琴末尾添加一个带有此添加的查询并提供链接。
  • 当他们在同一个组时变成这样:显示尺寸为:10m 和 20m 的产品,当它们在不同组中时:显示产品尺寸:10m 的颜色为绿色。这是一个小提琴dbfiddle.uk/…
【解决方案2】:

遗憾的是,我无法从您的 示例中理解很多:

例如,如果我有一个 product_id 8020 有两个选项( options_id 49 和 52 )当用户选择选项 49 计数必须显示 1 选项 49 中的产品和选项 52 中的 1 个产品

但是按照你的标题,一对多和你的问题:

但是当您必须选择一个或多个过滤器时,问题就来了 如何计算有多少产品可以组合 过滤器?

我会尝试用一个笼统的答案来解释。

首先,您必须弄清楚是什么使产品能够适应您选择的两个过滤器。如果您选择 filter_id '1''5'

(1, 32, 49, 8020, 65, 21)

(5, 32, 49, 8021, 65, 21)

我们可以看到他们唯一不同的是product_id,所以如果你想选择除了product_id之外共享所有东西的所有产品,你可以做一个非常基本的SELECT product_id, COUNT(product_id) AS total FROM filter_counter WHERE group_id = 32 AND category_id = 65

但是,如果您想根据标题中提到的 ONE TO MANY 制作整个解决方案,我建议您为您的产品创建一个新表,并让每个产品都有一个过滤器 ID .然后您可以计算共享相同过滤器的产品数量。您可以在这个 stackoverflow 问题中了解更多信息:How to implement one-to-one, one-to-many and many-to-many relationships while designing tables?

例子:

CREATE TABLE 'product' (
   product_id PRIMARY KEY,
   filter_id int REFERENCES filter_counter(id),
   ... More info for product
)

【讨论】:

  • @Ivan 所以这个答案没有回答你的问题?
  • 感谢您的帮助与我正在寻找的内容很接近
猜你喜欢
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
相关资源
最近更新 更多