1

というテーブルとUSERSというテーブル、およびテーブルADDRESSESがありADDRESS_TYPEます。各ユーザーは複数のアドレスを持つことができます。

SELECT *
FROM USER
INNER JOIN address ON address.userId = user.userId
INNER JOIN address_type ON address_type.id = address.addressType
WHERE addressType = 4 
    OR primaryAddress = 1

addressType が 4 の場合、アドレス テーブルをユーザー テーブルに結合したいのですが、addressType が 4 でない場合は、プライマリとしてマークされているアドレスを取得する必要があります。基本的に問題は、各ユーザーが 1 行のみを取得するようにクエリをグループ化する必要があることですが、ロジック = "addressType = 4 の場合はこのアドレスに参加し、それ以外の場合は primaryAddress = 1 の場合はこの他のアドレスに参加します"。

これが理にかなっていることを願っています。

編集:これらは私が扱っているテーブルです:

ユーザーテーブル

+--------+-----------------+-----------------+
| ユーザー ID | ファーストネーム | 姓 |
+--------+-----------------+-----------------+
| 10001 | デビー | デビー | バッソン |
| | 10002 | バマワマ | くどん |
| | 10003 | ジェシカ・エム | スティービー |
| | 10004 | キノン | ホワイト |
+--------------------+-----------------+-----------------+



住所タイプ
+----+------+-------------+------------+-------- ----+
| ID | コード | 説明 | 変更可能 | データステータス |
+----+------+-------------+------------+---------- --+
| 1 | ホーム | ホーム | 1 | 1 |
| | 2 | ブス | ビジネス | ビジネス | 1 | 1 |
| | 3 | SCH | 学校 | 学校 | 1 | 1 |
| | 4 | ドン | 寄付者の住所 | 1 | 1 |
+----+------+-------------+------------+---------- --+

アドレス表

+----------------+--------------------+--------------------- --+-------------+-------------+
| プライマリ アドレス | ユーザー ID | 通り1 | 都市 | アドレスタイプ |
+----+--------------------+-------------------------------------- --+-------------+-------------+
| 0 | 10001 | 12660 ピカルテ PL。| | サンディエゴ | 1 |
| | 0 | 10001 | 446 W ウィルシャー アベニュー | フラートン | フラートン | 2 |
| | 0 | 10001 | 4224 E. 114th ウェイ | ソーントン | 3 |
| | 1 | 10001 | 828コロラドブルバード。| | ロサンゼルス | 4 |
| | 0 | 10002 | 40A リンデン アベニュー、#2 | サマービル | 1 |
| | 0 | 10002 | 446 37th ストリート、#2 | オークランド | オークランド null | null |
| | 1 | 10002 | 私書箱 06562 | シカゴ | シカゴ | null | null |
| | 0 | 10002 | 1281 W. セカンド ストリート | サンペドロ | サンペドロ null | null |
| | 1 | 10003 | 10557 S. オークリー アベニュー | シカゴ | シカゴ | null | null |
| | 0 | 10003 | 1425 ハリソン ストリート、#324 | オークランド | オークランド null | null |
+----+--------------------+-------------------------------------- --+-------------+-------------+

4

5 に答える 5

1

これはあなたが探しているものですか?

SELECT *
FROM USER
INNER JOIN address ON address.userId = user.userId
INNER JOIN address_type ON address_type.id = address.addressType
WHERE addressType = 4 
OR NOT EXISTS
(SELECT addressType FROM USER
 INNER JOIN address ON address.userID = user.userID
 INNER JOIN address_type ON address_type.id = address.addressType
 WHERE addressType = 4)
AND primaryAddress = 1
于 2012-10-29T22:32:31.743 に答える
1

ADDRESS_TYPE テーブルを削除し、ADDRESS テーブルをユーザー アドレス テーブルにします。このテーブルには、2 つまたは 3 つのアドレスをサポートするのに十分な列があります。こうすれば、プライマリ ユーザー テーブルを台無しにすることはありません。

2 つ以上のアドレスが必要になることはありません (下記の例外を除きます)。結合と複雑さを失い、必要なことを行うためのアプリ ロジックが必要になります。あなたが設計した方法では、これらのテーブルに対するすべてのアクションが、1 つのテーブルだけの場合よりも複雑になります。

あなたが上で説明した方法を私が見ることができる唯一の方法は、これがビジネスユーザー向けのある種のアプリであり、配送先が複数ある場合です.

于 2012-10-29T22:17:46.460 に答える
1

UNION select のようなものを試しましたか?

多分このように:

SELECT *
FROM user, address, address_type 
WHERE address.userId = user.userId
AND address_type.id = address.addressType
AND addressType = 4 
UNION
SELECT *
FROM user, address, address_type 
WHERE address.userId = user.userId
AND address_type.id = address.addressType
AND primaryAddress = 1

テーブル構造が正しいかどうかはわかりません..しかし、基本的なポイントは、UNIONステートメントを使用してみることです:-)

于 2012-10-29T22:12:32.343 に答える
1

MySQL にはIF次の機能があります (さらに多くの機能があります)。

SELECT *,
       IF(addressType = 4, chosen_table.address_field_name, alternative_table.address_field_name) AS field_name

address_field_name住所フィールドの名前で 2 回置き換えます。chosen_tableは の「真」のブロックで、IFalternative_table「偽」のブロックです。

于 2012-10-29T22:06:21.860 に答える
1

他の回答が言うように、MySQL は IF をサポートしていますが、この場合は間違った方法だと感じています。私の感覚では、おそらく左結合の方が適切です。

これで中途半端になると思いますが、クエリを完了するには、「この他のアドレス」がどこから来たのかを知る必要があります。

SELECT
  *
FROM
  user
LEFT JOIN
  address ON (address.userId = user.userId AND address.addressType = 4)

(ps. address_type テーブルはちょっと冗長に思えるので、結合ではスキップしていますが、重要なのでしょうか?)

于 2012-10-29T22:05:45.063 に答える