1

私は顧客のショッピングカートからのORDERSテーブルを持っています。これは典型的な顧客名、住所などのフィールドのリストです。ねじれは、顧客が請求情報とは異なる出荷情報を入力すると、カートが出荷情報を適切なフィールド (shipName、shipAddress、ShipState など) に入力することです。ただし、顧客が自分自身に発送する場合、カートは配送情報を適切な配送フィールド (shipName、shipAddress、shipState) に移動しません。この情報を ordName、ordAddress、ordCity などのフィールドに保持し、配送関連のフィールドを空のままにします。

したがって、これらの配送フィールドは、顧客が自分自身に配送する注文では空になります。配送情報が提供されていない場合は、IF コマンドを使用して ordName、ordAddr などをエイリアス名に移動し、すべての注文タイプ (顧客が自分自身に配送するか、別の住所に配送するか) の配送情報が処理されるようにしました。その部分は、以下のクエリで正常に機能しています。

1つの問題が残っています。私の配送プログラムでは、長い州名 (ミシガン、ニューヨークなど) を使用できません。州は 2 文字の省略形 (例: MI、NY) である必要があります。長い州名と 2 文字の省略形の間のマッピングを持つ* STATESという名前のルックアップ テーブルがあります。ShipState エイリアスを使用して、特定の州の正しい 2 文字の名前を検索しようとしています。これを 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

データのオリジンはトランザクションの小さなセットであるため、非常に高速です。フィールドで州テーブルの2つのインスタンスにそれぞれ左結合し、空でない方に基づいて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

2 つのテーブルを結合しようとする場所にコードを配置する必要があります。誰かが助けてくれる構文エラーがあるだけかもしれません。state 列と state_abrev 列を持つ STATES というテーブルがある場合は、次のようにします。

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

于 2011-01-12T20:34:15.943 に答える