我有以下两个数据库表:
`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
这当然给了我我需要的数据,但并不完全是我需要的数据,因为它为每次付款返回一行。这意味着我以后必须按成员 ID 对行(在 PHP 中)进行分组,这样我就不会多次列出一个成员。我可以这样做,但我相信在 SQL 中这样做会更容易和更快。此外,此查询仅向我提供使用其 ID 付款的用户。
我觉得这应该很简单,但上一次我做的除了 SQL 中最简单的东西是 6-7 年前。
编辑:
LEFT OUTER JOIN
答案之一中的建议解决了“失踪”成员的问题。但是,按成员 ID 对结果进行分组的最佳方式是什么?我知道有一个GROUP BY
条款,但它并没有给我给定成员的所有付款,只有一个。我想我可以为每个成员运行一个新的付款查询,但我担心这会非常低效(我们大约有 300-400 个成员)。