我有以下两个数据库表:
`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名成员)。
答案 0 :(得分:2)
根据引用键列,您需要JOIN
两个表。
SELECT id, name, active, date, amount
FROM membership_members
LEFT OUTER JOIN membership_payments
ON membership_members.id = membership_payments.member;
我选择了LEFT OUTER JOIN
,以便还可以显示没有付款的成员。
有关联接的详细信息,请选中http://dev.mysql.com/doc/refman/5.0/en/join.html
修改强>
使用ORDER BY membership_members.id
获取某列所订购的记录。
分组不像排序。 GROUPING
按您提供的列合并所有记录。 ORDER BY
排序
答案 1 :(得分:1)
查看GROUP_CONCAT
MySQL子句。
或强>
您可以使用CONCAT
。
示例强>
SELECT CONCAT(`membership_payments.date`, ' ', `membership_payments.amount`)
FROM `membership_members`
LEFT OUTER JOIN membership_payments
ON membership_members.id = membership_payments.member;
答案 2 :(得分:1)
使用LEFT JOIN
INNER JOIN
。 INNER JOIN
仅在每个表上至少有一条记录时才显示记录。但LEFT JOIN
的运作方式不同。它显示左侧表中的所有记录,无论它是否在右侧表中具有匹配的记录。
SELECT id, name, active, date, amount
FROM `membership_members` a
LEFT JOIN `membership_payments` b
ON a.ID = b.member
要进一步了解联接,请访问以下链接: