0

我有以下两个数据库表:

`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 个成员)。

4

3 回答 3

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 排序

于 2013-04-09T09:01:35.787 回答
1

看一下GROUP_CONCATMySQL 子句。

Example

或者

您可以使用CONCAT.

例子

SELECT CONCAT(`membership_payments.date`, ' ', `membership_payments.amount`) 
   FROM `membership_members`
 LEFT OUTER JOIN membership_payments 
    ON membership_members.id = membership_payments.member;
于 2013-04-09T09:01:17.790 回答
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

要进一步了解有关联接的更多信息,请访问以下链接:

于 2013-04-09T09:01:49.510 回答