次の 2 つのデータベース テーブルがあります。
`membership_members` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` tinytext NOT NULL,
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
)
`membership_payments` (
`date` date NOT NULL,
`amount` int(11) NOT NULL,
`member` int(11) NOT NULL,
KEY `member` (`member`)
)
すべてのメンバーをリストしたいと思います。それぞれのメンバーについて、そのメンバーによるすべての支払いのリストを表示したいと思います。membership_payments.member
列は外部キーですmembership_members.id
(これは MySQL であるため、外部キーを明示的に指定することはできません)。支払いがない場合でも、メンバーをリストしたいことに注意してください。
次のようなものです:
* John Smith
- 2012-05-06 $100
- 2012-01-02 $100
* Brian Jones
* Mike Jackson
- 2012-09-02 $50
私はこのクエリで試しました:
SELECT id, name, active, date, amount
FROM `membership_members`,
`membership_payments`
WHERE membership_members.id = member
もちろん、これにより必要なデータが得られますが、支払いごとに行が返されるため、必要なデータが正確に得られるわけではありません。つまり、後で (PHP で) 行をメンバー ID でグループ化して、メンバーを複数回リストしないようにする必要があります。それはできますが、SQL で行う方が簡単で速いと思います。また、このクエリは、ID で支払いを行っているユーザーのみを提供します。
これは単純であるべきだと思いますが、前回 SQL で最も単純なこと以外を行ったのは 6 ~ 7 年前のことです。
編集:
LEFT OUTER JOIN
回答の1つで提案されている「欠落している」メンバーの問題を解決します。しかし、結果をメンバー ID でグループ化する最良の方法は何ですか? 条項があることは知っていGROUP BY
ますが、特定のメンバーのすべての支払いが得られるわけではなく、1 つだけです。メンバーごとに新しい支払いクエリを実行できると思いますが、これは非常に非効率的ではないかと心配しています (約 300 ~ 400 人のメンバーがいます)。