【问题标题】:Count clause -> incorrect count value计数子句 -> 不正确的计数值
【发布时间】:2021-10-21 13:45:34
【问题描述】:

我们在使用带有内/左连接的计数组合时遇到了一个问题,我们无法弄清楚如何解决。 对于此事,我们将不胜感激!

示例中有 4 个表:

1: providers: Including 2 providers
2: providers_categories: Including 2 categories. 1 provider can be in multiple categories (this seems to be causing the issue)
3: connections_providers: connecting the providers to the categories
4: reviews_providers: currently we have included 1 rating per provider

目标:从表reviews_providers 中输出评论计数。

问题:提供商 2 包含在 2 个类别中。评论计数加倍:每个提供商类别有 1 条计数:即使只有 1 条条目,也会打印总共 2 条评论。

谢谢!

代码:

SELECT prov.id, prov.title, prov_cat.title AS category, AVG(reviews.rating) AS rating, COUNT(reviews.rating) AS count 
FROM connections_providers_categories conn 
INNER JOIN providers_categories prov_cat 
 ON prov_cat.id = conn.category_id 
LEFT JOIN reviews_providers reviews 
 ON reviews.provider_id = conn.provider_id 
INNER JOIN providers prov 
 ON prov.id = conn.provider_id 
GROUP BY prov.id 
ORDER BY prov.title ASC

CREATE TABLE `connections_providers_categories` (
  `provider_id` int(4) UNSIGNED NOT NULL,
  `category_id` int(4) UNSIGNED NOT NULL
) ENGINE=MyISAM DEFAULT;

INSERT INTO `connections_providers_categories` (`provider_id`, `category_id`) VALUES
(1, 1),
(2, 1),
(2, 2);

CREATE TABLE `providers` (
  `id` int(4) UNSIGNED NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT;

INSERT INTO `providers` (`id`, `title`) VALUES
(1, 'Provider 1'),
(2, 'Provider 2');

CREATE TABLE `providers_categories` (
  `id` int(4) UNSIGNED NOT NULL AUTO_INCREMENT,
  `title` varchar(60) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT;

INSERT INTO `providers_categories` (`id`, `title`) VALUES
(1, 'Category 1'),
(2, 'Category 2');

CREATE TABLE `reviews_providers` (
  `id` int(4) UNSIGNED NOT NULL AUTO_INCREMENT,
  `provider_id` int(4) UNSIGNED NOT NULL,
  `rating` enum('1','2','3','4','5') DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT;

INSERT INTO `reviews_providers` (`id`, `provider_id`, `rating`) VALUES
(1, 2, '5'),
(2, 1, '3');

我们的问题可能类似于以下问题,但我们找不到答案/即使这两个问题都包含多个计数,我们也可以看到它是相同的情况:count is multiplied after adding left join 看来我们可能需要一个子查询,但我们不知道该怎么做。

有什么建议吗? 谢谢!

【问题讨论】:

  • 没有翻倍dbfiddle.uk/…
  • 谢谢!然而;在 dbfiddle 的示例中,提供者 2 的计数仍然为 2。即使提供者连接到多个类别,我们也需要计数为 1,因为在评级表中每个提供者只有一个条目。谢谢!

标签: mysql join count


【解决方案1】:

你可以使用子查询顶部得到你的结果

SELECT prov.id, prov.title, GROUP_CONCAT(prov_cat.title) AS category, reviews.rating , reviews.count 
FROM connections_providers_categories conn 
INNER JOIN providers_categories prov_cat 
 ON prov_cat.id = conn.category_id 
LEFT JOIN (SELECT  provider_id, AVG(rating) AS rating, COUNT(provider_id) AS count FROM reviews_providers GROUP BY provider_id)  reviews 
 ON reviews.provider_id = conn.provider_id 
INNER JOIN providers prov 
 ON prov.id = conn.provider_id 
GROUP BY prov.id,prov.title
ORDER BY prov.title ASC
编号 |标题 |类别 |评级 |数数 -: | :--------- | :-------------------- | -----: | ----: 1 |提供者 1 |第一类 | 3 | 1 2 |提供者 2 |第 2 类,第 1 类 | 5 | 1

db小提琴here

【讨论】:

  • 您好,谢谢!如果我们每个提供者只有一个条目,则此方法有效。如果我们添加评分,计数仍然是 1。我们需要计算每一行,但不能加倍。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
相关资源
最近更新 更多