0

次の 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 人のメンバーがいます)。

4

3 に答える 3

2

JOINキー列の参照に基づいて、2 つのテーブルが必要になります。

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各テーブルに少なくとも 1 つのレコードがある場合にのみレコードを表示します。しかし、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 に答える