2012-03-06 1 views
0

total_filestotal_notesが返されたときに両方が同じであるため、SUM関数を使用して3つのテーブルから行を数えようとしていますが、少なくとも1つのファイルがあり、total_filesはそれがなぜそれをしているのかわからないtotal_notesと同じ値を取るでしょう。SUMを使用して関連するレコードを持つ3つのテーブルをカウントする

レコードの行ごとにレコードに割り当てられた合計ファイル数、合計メモ数、合計連絡先数を含むレコードリストとして返される各レコードに関連する行数をカウントする必要があります(ファイル、メモや連絡先はカウントされただけで表示されません)。

私のクエリを以下に示します。

SELECT rec.street_number, 
     rec.street_name, 
     rec.city, 
     rec.state, 
     rec.country, 
     rec.latitude, 
     rec.longitude, 
     LEFT(rec.description, 250) AS description, 
     usr.username, 
     usr.full_name, 
     ppl.person_id, 
     ppl.first_name, 
     ppl.last_name, 
     SUM(IF(rlk.record_id = rec.record_id, 1, 0)) AS total_contacts, 
     SUM(IF(files.record_id = rec.record_id, 1, 0)) AS total_files, 
     SUM(IF(notes.record_id = rec.record_id, 1, 0)) AS total_notes, 
     (
      SELECT COUNT(DISTINCT rec.record_id) 
      FROM records rec 
      WHERE rec.marked_delete = 0 AND rec.is_archive = 0 
     ) AS total_records 
FROM 
(
    records rec 

    INNER JOIN members usr ON rec.user_id = usr.user_id 

    LEFT OUTER JOIN record_links rlk ON rec.record_id = rlk.record_id 

    LEFT OUTER JOIN people ppl ON ppl.person_id = rlk.person_id AND rlk.record_id = rec.record_id 

    LEFT OUTER JOIN files files ON files.record_id = rec.record_id 

    LEFT OUTER JOIN notes notes ON notes.record_id = rec.record_id 
) 
WHERE rec.marked_delete = 0 AND rec.is_archive = 0 
GROUP BY rec.record_id 
ORDER BY rec.submit_date DESC 
LIMIT 0, 25 

基本的にあなたが見ることができるように、これらの表から来ている関連する行をカウントしますが、私は真剣にtotal_filesのだろうか理解していない SUMがありますtotal_notesと同じ値を取っている私はここで何か間違っていますか?

答えて

1

recnotesfilesの両方に参加しているからです。

レコード1に2つの音符と1つのファイルがあり、レコード2に2つの音符と2つのファイルがあり、レコード3に音符はありますがファイルはありません。すべてのfile_idが(同じrecord_id内)のすべてのnote_idに参加しますか

+-----------+---------+---------+ 
| record_id | file_id | note_id | 
+-----------+---------+---------+ 
|   1 |  1 |  1 | 
|   1 |  2 |  1 | 
|   2 |  3 |  2 | 
|   2 |  3 |  3 | 
|   2 |  4 |  2 | 
|   2 |  4 |  3 | 
|   3 | NULL |  4 | 
+-----------+---------+---------+ 

注:

その後テーブルrec LEFT OUTER JOIN files ... LEFT OUTER JOIN notesは次のようになります。また、SUM(IF(files.record_id = rec.record_id,1,0))があるため、結合条件はfiles.record_id = rec.record_idであり、実際には/record_idとなります。

代わりにCOUNT(DISTINCT files.id)COUNT(DISTINCT records.id)をお勧めします。 COUNTの列files/notes上の主キーになり、ないfiles.record_id:もちろん

SELECT rec.record_id, 
     COUNT(DISTINCT files.id) AS total_files, 
     COUNT(DISTINCT notes.id) AS total_notes 
FROM rec 
-- note: LEFT OUTER JOIN is the same as LEFT JOIN in MySQL 
LEFT JOIN files ON files.record_id=rec.record_id 
LEFT JOIN notes ON notes.record_id=rec.record_id 
GROUP BY record_id 


+-----------+-------------+-------------+ 
| record_id | total_files | total_notes | 
+-----------+-------------+-------------+ 
|   1 |   2 |   1 | 
|   2 |   2 |   2 | 
|   3 |   0 |   1 | 
+-----------+-------------+-------------+ 

、必要に応じてクエリを調整します(/参加し、それらの余分な列に追加します)。

+0

注 - 'total_contacts'列についても同じです。 –

+0

Whoa!この詳細な回答をいただきありがとうございます。私はあなたに10倍の親指を与えることができました。再度、感謝します。 – MacMac

関連する問題