0

我有三个表ordersuser_addressesalternate_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
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不需要了,取而代之的是您引用用户的地址之一。FOREIGN KEY (user_id, address_id) REFERENCES addresses (user_id, address_id),或类似的东西。

于 2013-04-12T08:25:29.517 回答
1

您真正的问题是,user_addresses并且alternate_addresses是不同的表。因为它们是不同的表,所以很难让 SQL 统一对待它们。

拥有一个可以由用户和(可选)订单引用的单个地址表会更好的设计,然后您将能够设计一个连接到每个订单的正确地址的 JOIN 条件。

于 2013-04-12T08:24:10.490 回答