0

ordersuser_addressesおよびの 3 つのテーブルがありalternate_addressesます。ユーザーには常に user_address があります。オーダーには があり、これにはまたはalternate_address_idが含まれる場合があります。alternate_address_idNULL

今、私のクエリは次のようになります。

SELECT
  IF(ISNULL(orders.alternate_address_id), a.firstname, u.firstname) AS firstname,
  IF(ISNULL(orders.alternate_address_id), a.lastname, u.lastname) AS lastname
  -- etc.
FROM orders
LEFT JOIN alternate_addresses a ON (
  orders.alternate_address_id IS NOT NULL
  AND orders.alternate_address_id = a.alternate_address_id)
LEFT JOIN user_addresses u ON (
  orders.alternate_address_id IS NULL
  AND orders.user_id = u.user_id)

IF(ISNULL())最初のアドレスの後にどのアドレスを使用する必要があるかを知っているので、すべてのアドレス フィールドの一部を行うのは冗長に思えます。

これを行うためのより良い方法はありますか (テーブルのデザインを変更できません)?

ご意見ありがとうございます。

4

2 に答える 2

1

ここでの本当の問題は、user_addressesalternate_addressesが異なるテーブルであることです。これらは異なるテーブルであるため、SQL でそれらを均一に処理するのは困難です。

ユーザーおよび (オプションで) 注文によって参照できる単一の住所テーブルを持つ方がはるかに優れた設計であり、注文ごとに正しい住所に結合する JOIN 条件を考案できます。

于 2013-04-12T08:24:10.490 に答える
1
SELECT a.firstname AS firstname, a.lastname AS lastname, ...
FROM orders
JOIN alternate_addresses a ON (orders.alternate_address_id = a.alternate_address_id)

UNION

SELECT u.firstname AS firstname, u.lastname AS lastname, ...
FROM orders
LEFT JOIN user_addresses u ON (orders.user_id = u.user_id)
WHERE orders.alternate_address_id IS NULL

実際、drquicksilverにはポイントがあります。addressesアドレスのタイプ (メイン、代替、他に何?) 用の追加の列をテーブルに追加することをお勧めします。alternate_address_id代わりに、ユーザーのアドレスの 1 つを参照します。FOREIGN KEY (user_id, address_id) REFERENCES addresses (user_id, address_id)、またはこれらの線に沿った何か。

于 2013-04-12T08:25:29.517 に答える