1

私は、ユーザーがいて、住所と住所の両方を保存する単純なデータベースをセットアップしようとしています。私は2つのテーブルを持っています

ユーザー

id (Primary Key)    
name (Varchar 255)
residential_id (foreign key)
postal_id (foreign key)

住所

id (primary key)
type (enum of R and P)
street (varchar 255)
suburb (varchar 255)

内部結合を実行しようとしているので、次のような結果セットになります。

id-名前-住宅-通り-住宅_郊外、郵便_通り、郵便_郊外

アドレスの詳細についてnullの結果が表示され続けます。これは、アドレステーブルから2セットのデータを取得していて、競合があるためだと思います。住居IDと郵便IDにリンクされている住所欄を同時に返却することはできますか?

私のSQL構文は

SELECT * FROM users 
LEFT JOIN address
ON (users.residential_id = address.id AND users.postal_id = address.id)

編集。指摘されているように、私のDB設計はかなり貧弱であり、私はそれを改善しようとしています。私が達成しようとしている重要なことは、個人の詳細とそれに関連する住所および住所を保存できることです。たとえば、データベースを拡張して職場の住所を含めることは決してありません。これにより、テーブルの複雑さが軽減されることを願っています。

4

4 に答える 4

3

以下は、

  1. アドレスの「id」列は、ユーザーテーブルへの外部キーです。
  2. アドレステーブルには、郵便と居住地を区別するaddressType列があります

あなたが欲しいものは:

select 
  u.*, 
  res.street residential_street,
  res.suburb residential_suburb,
  pos.street postal_street,
  pos.suburb postal_suburb
from users u
    left join address res on u.id=res.id and res.addressType='R'
    left join address pos on u.id=pos.id and pos.addressType='P'

ここで重要なのは、アドレステーブルに2回参加する必要があるということです。各結合が適切なタイプのアドレスのみを選択するように、アドレスタイプ識別子が必要です。スキーマが異なる場合は、明確にしてください。回答を変更します。

于 2009-11-18T04:25:57.823 に答える
0

列アドレスがidと等しいかどうかを確認していますが、どのような場合でもこれは当てはまらないと思います。

于 2009-11-18T04:11:27.020 に答える
0

それは比較的簡単です。アドレステーブルに2回参加するだけです。

SELECT u.id,
       u.name,
       ar.street residential_atreet,
       ar.suburb residential_suburb,
       ap.street postal_street,
       ap.suburb postal_suburb
FROM users u
LEFT JOIN address ar ON u.residential = ar.id
LEFT JOIN address ap ON u.postal = ap.id

この種のデータモデルは、私が個人的に好むものではありません。代わりに、アドレスタイプフィールドを持ち、1対多の関係(アドレステーブルのuser.id外部キー)を持つことをお勧めします。

直面する問題の1つは、アドレスのユーザー所有権を決定することが(モデルでは)厳密に単純ではないことです。また、孤立したアドレスも見つかりません。

1つの提案:住宅と郵便は外部キーであるため、SQLを読むときにわかりやすくするために、それらにそのような名前を付けるようにしてください(たとえば、residence_idとpostal_id)。

于 2009-11-18T04:14:45.490 に答える
0

@ m3mbran3私の提案は、ユーザーからのResidence_idフィールドとpostal_idフィールドをダンプすることです。

ユーザー

id (Primary Key)    
name (Varchar 255)

住所

id (if required, otherwise primary key is combo of userid,type)
user_id
type (enum of R and P)
street (varchar 255)
suburb (varchar 255)

その後、に戻ります

SELECT u.id,
       u.name,
       ar.street residential_street,
       ar.suburb residential_suburb,
       ap.street postal_street,
       ap.suburb postal_suburb
FROM users u
LEFT JOIN address ar 
           ON u.id = ar.user_id
           AND ar.type = 'R'
LEFT JOIN address ap 
           ON u.id = ap.user_id
           AND ap.type = 'P'

@Cletusの提案のバリエーション。ユーザーが住所を持っていて住所がない場合、またはその逆の場合はnullが発生する可能性があることに注意してください

于 2009-11-18T05:43:11.380 に答える