2

私はSQL開発に不慣れです。だから私はSOから助けを得たいと思います。

私は3つのテーブルを持っています:学生、学生アドレス、学生電話

それらのスキーマはおおよそ次のとおりです。

student
-------
student_id (Primary Key)
student_name
father_name
mother_name

student_addresses
-----------------
student_address_id (Primary Key)
student_id (Foreign Key)
address
zip_code

student_phones
--------------
student_phone_id (Primary Key)
student_id (Foreign Key)
phone_type
phone_number

student_addressesstudent_phonesはどちらもhas_many 関係です。そのため、特定のStudent_idの Studentからすべてのフィールドを SELECT したいと思いますが、その Student_id の Student_addresses と student_phonesから一致するカウント (合計) のみを選択したいと思います。どうすればそれを取得できますか?

このクエリを試しましたが、エラーが返されます:

SELECT students.student_id,student_name,father_name,mother_name,
       COUNT(student_addresses.student_id) AS total_addresses,    
       COUNT(student_phones.student_id) AS total_phones
 FROM students,student_phones,student_addresses
 WHERE students.student_id = student_phones.student_id AND
       students.student_id = student_addresses.student_id AND
       students.student_id = 7;

PS:現在、PostgreSQLでこれを使用しています。ただし、MySQL でも動作させたいと考えています。つまり、2 つの異なるクエリが必要ということですか? 私の知る限り、この目的のために、単一のクエリだけが両方で機能します(このクエリ要件に関する限り、MySQL と PostgreSQL の両方が同じ SQL 実装に従っているため)。

GROUP BYを使わずにできるかどうか疑問に思っています。学生テーブルにさらに多くのフィールド (たとえば 12) があると仮定すると、すべてのフィールド名を SELECT と GROUP BY(AFAIK) の両方に配置する必要があり、これは少し洗練されていないように思えます。

4

3 に答える 3

1

これは MySQL と PostgreSQL で動作するはずです:

SELECT s.student_id,
       max(s.student_name) student_name,
       max(s.father_name) father_name,
       max(s.mother_name) mother_name,
       COUNT(distinct a.student_address_id) total_addresses,    
       COUNT(distinct p.student_phone_id) total_phones
FROM students s
LEFT JOIN student_phones p ON s.student_id = p.student_id
LEFT JOIN student_addresses a ON s.student_id = a.student_id
WHERE s.student_id = 7
GROUP BY s.student_id
于 2013-07-23T09:40:24.080 に答える