У меня есть три стола: orders
, user_addresses
и alternate_addresses
. Пользователь всегда имеет user_address. Заказ имеет номер alternate_address_id
, который может содержать alternate_address_id
или NULL
.Есть ли лучший способ использовать значения из таблицы a или таблицы b?
Сейчас мой запрос выглядит следующим образом:
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())
части для каждого поля адреса, так как я знаю, какой адрес мне нужно использовать после первой.
Есть ли лучший способ сделать это (я не могу изменить дизайн таблиц)?
Спасибо за ваши мысли .
[COALESCE()?] (Http://dev.mysql.com/doc/refman/5.0/ru/comparison-operators.html#function_coalesce) –
Я считал это. Но если альтернативный_адрес не имел, допустим, имя_компании, он будет смешиваться в возможном user_addresses.company_name, что будет проблемой. – Chris
Вы говорите, что вы не можете изменить дизайн стола. Можете ли вы по крайней мере изменить логику приложения, чтобы каждый заказ имел альтернативный_адрес (который по умолчанию совпадает с user_address)? Я думаю, что это еще лучше в логических терминах, поскольку ваши прошлые заказы будут иметь адрес, куда они были отправлены, даже если пользователь изменит свой текущий адрес позже. –