1

ケース: contract.id=members.cidで関連付けられた「contracts」と「members」の2つのテーブルがあります。各契約には、1人のメインメンバーと複数のセカンダリメンバー(通常はメインメンバーの子供と配偶者)がいます。メインメンバーの詳細(名前、住所など)はテーブルコントラクトに保存されますが、追加メンバーの詳細はテーブルメンバーに保存されます。(悪い論理、私は知っていますが、これは最初は混乱であり、データベースとWebサイトを再設計する時間が必要です)

必要な出力: すべての契約のバッチ印刷を実行する場合(たとえば、毎週金曜日)、各メンバーの契約のコピーも印刷する必要がありますが、メインメンバーではなく契約のメンバーの詳細を使用します。

質問: これはどのようにmysqlクエリに変換されますか?さて、それは左結合ですが、「結合された行ではなくテーブルからデータを出力する」とはどうすればよいですか?memberscontracts

2つのテーブルにある主なフィールドは、名前と名前です。ドラフトクエリの例ではこれらで十分です。

テーブルとデータの例:

contracts
-------------------------
id  |  name  | surname | 
-------------------------
1   |  Tom   | Jones   |
2   |  Jamie | Oliver  |

members
--------------------------------
id  |  cid |  name  | surname | 
--------------------------------
1   |   1  |  Jack  | Jones   |
2   |   1  |  Anne  | Jones   |
3   |   2  |  Cathy | Wilson  |

したがって、私が望む結果は次のようになります。

cid | name   | surname |
--------------------------
1   |  Tom   | Jones   |
1   |  Jack  | Jones   |
1   |  Anne  | Jones   |
2   |  Jamie | Oliver  |
2   |  Cathy | Wilson  |

私が書いたら

SELECT c.name as name, c.surname as surname, m.name as name, m.surname as surname
FROM contracts c
join members m on c.id = m.cid

私は単にnameとname_1、surnameとsurname_1になりますが、すべての名前をnameに分類し、他のすべての一致する列についても同様にします。

4

2 に答える 2

0

これは私が最終的に行ったことであり、うまくいきました(フィールド名は異なりますが、構文が重要です):

SELECT u.id, u.onoma_u, u.name_u,
       coalesce(u.programa, aa.programa) as programa,
       coalesce(u.barcode, aa.barcode) as barcode,
       coalesce(u.plan, aa.plan) as plan,
       coalesce(u.im_exp, aa.im_exp) as im_exp,
       coalesce(u.symb, aa.symb) as symb
       FROM (SELECT a1.id, a1.onoma_u, a1.name_u, a1.programa, a1.barcode, a1.plan, a1.im_exp, a1.symb
       FROM aitisi a1 
        UNION
           SELECT a2.id, m.name, m.surname, NULL, NULL, NULL, NULL, NULL
           FROM members m
        JOIN aitisi a2 ON a2.id = m.symbid) u
       JOIN aitisi aa ON aa.id = u.id;

エイリアスと NULLS をダミー フィールドとして使用して空白を埋めました。

于 2012-06-25T16:57:04.897 に答える
0

これがうまくいくことを願っています:::

select c1.id, c1.name, c1.surname 
from contracts c1
union 
(Select m.id, m.name, m.surname 
  from 
members m left join contracts c on (c.id = m.cid))
于 2012-06-20T18:21:53.743 に答える