2

結合されたテーブルの 1 つが 1 対多の関係を持つ、非常に大きなクエリで COUNT を実行する必要があります。これは、1 対多テーブルの「多」側でアイテムが繰り返される回数をすべてのデータに乗算しているため、結果が狂っています。

これは、問題を強調するために関連部分のみを示すクエリの短縮版です。

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

1 対多の関係を持つ 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 に答える