2

我需要对一个相当大的查询执行 COUNT,其中一个连接的表具有一对多的关系。这是抛弃我的结果,因为所有数据都乘以一个项目在一对多表的“多”侧重复的次数。

这是查询的缩短版本,仅显示突出问题的相关部分:

SELECT COUNT(trimtype) FROM versiontrim 
INNER JOIN trims USING (trim_id) 
INNER JOIN prices USING(version_id) 
INNER JOIN m_versions USING(version_id)
WHERE trimtype IN('sec', 'help') AND price BETWEEN 200001 AND 210000 
GROUP BY version_id

除了具有一对多关系的 m_versions 之外,所有表都非常简单,如下所示:

version_id       serv_id

  1                 1
  1                 2
  1                 3
  1                 4
  1                 5
  .... and so on

查询的预期结果是:

version_id  COUNT(trimtype)     
44          9
54          7
69          9
214         10
216         6
282         1
290         10

相反,我得到了这个,即所有计数乘以 5,这是在 m_versions 表中重复 version_id 的次数:

version_id  COUNT(trimtype)     
44         45
54          35
69          45
214         50
216         30
282         5
290         50

如何避免这种行为?谢谢

4

1 回答 1

2

它与表上的多条记录匹配,m_version这就是您得到无效结果的原因。尝试将其包装为子查询,

INNER JOIN (SELECT DISTINCT version_id FROM m_versions) m USING(version_id)

更新

所以完整的查询看起来像这样,

SELECT version_id, COUNT(trimtype) 
FROM   versiontrim 
       INNER JOIN trims USING (trim_id) 
       INNER JOIN prices USING(version_id) 
       INNER JOIN (SELECT DISTINCT version_id FROM m_versions) m USING(version_id)
WHERE  trimtype IN('sec', 'help') AND price BETWEEN 200001 AND 210000 
GROUP  BY version_id
于 2013-06-01T13:12:50.830 回答