1

我有来自客户购物车的ORDERS表。这是典型的客户姓名、地址等字段列表。不同之处在于,当客户输入与账单信息不同的运输信息时,购物车会将运输信息填充到适当的字段(shipName、shipAddress、ShipState 等)中。但是,当客户自己发货时,购物车不会将发货信息移动到合适的发货字段(即shipName、shipAddress、shipState)。它将这些信息保存在 ordName、ordAddress、ordCity 等字段中,然后将运输相关字段保持为空。

因此,对于客户自己发货的订单,这些发货字段为空。当没有提供运输信息时,我使用 IF 命令将 ordName、ordAddr 等移动到别名,以便处理所有订单类型的运输信息(无论是客户发货到自己还是其他地址)。这部分在我下面的查询中运行良好。

一个问题仍然存在。我的运输计划不能使用长州名(例如,密歇根州、纽约州等)。它需要状态是两个字符的缩写(例如,MI,NY)。我有一个名为 * STATES的查找表,它具有长状态名称和两个字符缩写之间的映射。我正在尝试使用 ShipState 别名来查找给定状态的正确两个字符名称。我尝试将其作为 JOIN 执行,但不断出现错误。我删除了我正在使用的连接,只显示了现在可以正常工作的代码,但没有为状态缩写进行映射。有人可以帮忙吗?

SELECT   
  orders.ordDate AS `Date`,  
  orders.ordID AS Order_ID,  
  orders.ordEmail AS Email,  
  IF(ordShipName = '          ', ordName, ordShipName) AS Name,  
  IF(ordShipAddress = '          ', ordAddress, ordShipAddress) AS Address_1,  
  IF(ordShipAddress2 = '          ', ordAddress2, ordShipAddress2) AS Address_2,  
  IF(ordShipCity = '          ', ordCity, ordShipCity) AS City,  
  IF(ordShipState = '          ', ordState, ordShipState) AS ShipState,  
  IF(ordShipZip = '          ', ordZip, ordShipZip) AS Postal,  
  IF(ordShipCountry = '          ', ordCountry, ordShipCountry) AS Country,  
  IF(ordShipPhone = '          ', ordPhone, ordShipPhone) AS Phone,  

FROM  
  orders   

WHERE  
  orders.ordID > 21700  
  HAVING  
  Country = 'United States of America' 
4

3 回答 3

1

您不能使用列别名 ShipState 来连接查找表。相反,再次重复您的 IF 构造:

SELECT   
  orders.ordDate AS `Date`,  
  orders.ordID AS Order_ID,  
  orders.ordEmail AS Email,  
  IF(ordShipName = '          ', ordName, ordShipName) AS Name,  
  IF(ordShipAddress = '          ', ordAddress, ordShipAddress) AS Address_1,  
  IF(ordShipAddress2 = '          ', ordAddress2, ordShipAddress2) AS Address_2,  
  IF(ordShipCity = '          ', ordCity, ordShipCity) AS City,  
  IF(ordShipState = '          ', ordState, ordShipState) AS ShipState,  
  IF(ordShipZip = '          ', ordZip, ordShipZip) AS Postal,  
  IF(ordShipCountry = '          ', ordCountry, ordShipCountry) AS Country,  
  IF(ordShipPhone = '          ', ordPhone, ordShipPhone) AS Phone,  
  STATE.StateAbbreviation
FROM  
  orders   
    INNER JOIN STATES
    ON IF(orders.ordShipState = '          ', orders.ordState, orders.ordShipState) = STATES.State

WHERE  
  orders.ordID > 21700  
  HAVING  
  Country = 'United States of America' 
于 2011-01-12T20:26:03.917 回答
0

由于数据的来源是一小组事务,它会非常快,我会让它分别在它们的字段上对状态表的两个实例进行左连接,并让你的 SELECT 基于哪个不为空......如

select 
     ...(other fields),
     IF(orders.ordShipState = '          ', s1.StateName, s2.StateName ) as StateName
   from 
      Orders
         left outer join states s1
            on orders.ordstate = s1.state
         left outer join states s2
            on orders.ordShipState = s2.state
   where 
      orders.ordID > 21700
      (etc with rest of query)...

这样,连接将始终基于两种可能的状态进行连接......因此,无论哪种存在,根据您的偏好,首先获得该状态,否则获得另一个。

于 2011-01-13T02:02:26.887 回答
0

您应该将代码放在尝试连接两个表的位置。您可能只是遇到有人可以帮助您解决的语法错误。如果您有一个名为 STATES 的表,其中包含 state 和 state_abrev 列,请尝试以下操作:

选择 ..., .., ..., STATES.state_abrev, ..., ..., from orders, STATES where STATES.state = orders.ordShipState AND ... ... HAVING ...

于 2011-01-12T20:34:15.943 回答