查询来自另一个表的子结果

时间:2013-04-09 08:59:07

标签: mysql sql

我有以下两个数据库表:

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

3 个答案:

答案 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子句。

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;

答案 2 :(得分:1)

使用LEFT JOIN

基本上,你现在正在做的是INNER JOININNER JOIN仅在每个表上至少有一条记录时才显示记录。但LEFT JOIN的运作方式不同。它显示左侧表中的所有记录,无论它是否在右侧表中具有匹配的记录。

SELECT  id, name, active, date, amount
FROM    `membership_members` a
        LEFT JOIN `membership_payments` b
            ON a.ID = b.member

要进一步了解联接,请访问以下链接: