2011-01-12 5 views
1

私は持っていてオーダーテーブルからお客様のショッピングカート。これは典型的な顧客名、住所などのフィールドの一覧です。これは、顧客が請求情報と異なる出荷情報を入力したときにカートが適切なフィールド(shipName、shipAddress、ShipStateなど)に配送情報を入力するということです。しかし、顧客が自分自身に出荷する場合、カートは出荷情報を出荷のための適切なフィールド(すなわちshipName、shipAddress、shipState)に移動させない。この情報はordName、ordAddress、ordCityなどのフィールドに保持され、出荷関連のフィールドは空のままになります。mySQLクエリの質問

したがって、これらの出荷項目は、顧客が出荷する注文の場合は空です。私はIFコマンドを使用して、出荷情報が提供されていないときにordName、ordAddrなどをエイリアス名に移動しました。これにより、すべての注文タイプ(顧客が別の住所に出荷されたかどうか)の出荷情報が処理されます。その部分は下のクエリで正常に動作しています。

1つの問題が残ります。配送プログラムで長い州名(ミシガン、ニューヨークなど)を使用することはできません。状態は2文字の略語(例えば、MI、NY)である必要があります。 * STATESというルックアップテーブルがあり、ロングステート名と2文字の省略形の間のマッピングがあります。 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' 
+0

壊れたSQLを投稿してください。 – SenorPuerco

+0

また、単なる提案です。データがないときにordShipName、ordShipAddress列がNULLに設定され、MySQL関数ifnull()を使用するように変更できますか?それは多くのクリーナーになるようです。 http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull – SenorPuerco

+0

しかし、カートは購入した商品であり、カートのデータを変更することには消極的です私がカートを更新するときはいつでも、構造を変更する必要があります。 – Alan

答えて

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' 
+0

笑とジョー<3 –

+0

ジョー、ありがとう!完璧に働いた。 – Alan

+0

@Alan:喜んで助けてください。あなたはこの回答を受け入れてもらえますか? –

0

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

select ...、..、...、STATES.state_abrev、...、... .state = orders.ordShipState AND ... ... HAVING ...

+0

私は正確にわかりません。 My ShipsStateエイリアスには、すべての注文のロングステート名(ニューヨーク、ミシガンなど)が含まれています。ステートルックアップテーブルを使用して、ShipStateエイリアスで表される値を状態の省略形に変更する必要があります。 – Alan

+0

右、あなたはSTATES.state_abrevがorders.ordShipDate = STATES.state(AND order.ordID =ユーザーID *またはw.e *) ん意味をなさない、STATES(両方のテーブル)の受注FROM(略称を取得する)を選択しますか? 「WHERE orders.ordShipDate = STATES.state」、SRY><どちらか、このウェブサイトに改行を追加する方法をあなたの参加 –

+0

ノーアイデアのようになります –

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)... 

としてこの方法で、参加は常に可能な状態の両方に基づいてジョインを持つことでしょう...だから、どんなあなたの好みに基づいて1つ存在し、最初にその状態を取得し、そうでなければ他を取得します。