0

私のmysql構文について助けが必要です。

私のテーブルにはユーザー情報がありますが、出荷先と請求先の注文番号が同じです。

請求先住所への発送を選択する場合もあります。ユーザーが配送先住所を入力しなかった場合と、配送先住所を入力した場合の注文番号レコードのみが必要です。

彼らが請求先と配送先住所の両方を入力した場合、それが理にかなっていれば、配送先住所だけが必要です.

テーブルには、1 つの注文番号に対して重複するフィールドがある場合があります。わかりにくい場合は、以下をご覧ください。

------------SQL TABLE ----------- 
order_id | address_type | user_name       | address
100      | billto       | Homer Simposn   | 123 Main St.
100      | shipto       | Homer Simpson   | 455 XYZ Ave. 
101      | billto       | Peter Griffin   | 780 111th St.
102      | billto       | Charles Xavier  | 555 Bergen St.
102      | shipto       | Jean Gray       | 555 Bergen St.

出力を次のようにする必要があります。

100 - shipto - Homer Simposn - 455 XYZ Ave. 
101 - billto - Peter Griffin - 780 111th St.
102 - shipto - Jean Gray - 555 Bergen St.

「shipto」レコードのみを返す構文は次のとおりです。

    SELECT * FROM order_info AS A WHERE A.address_type = 'shipto' AND 
NOT EXISTS (SELECT B.address_type 
                    from order_info AS B 
                    where B.address_type = A.address_type 
                    and B.address_type = 'billto')

を返さIFないようなことをしたいのですが、SQL構文ですべてを行うことは可能ですか?shiptobillto

ありがとう!

4

2 に答える 2

1

これは、行のグループごとの最大値を見つけることで実現できます。

具体的には、順序をIDとして使用し、サブクエリで「最大」アドレスタイプを見つけ(存在するかshiptoどうかを検出しますbillto)、その結果を使用して外部クエリの行に接続します。

例(非効率的な相関サブクエリを使用):

SELECT * FROM order_info AS A WHERE A.address_type = (
   SELECT MAX(address_type) FROM order_info AS B 
   WHERE A.order_id = B.order_id )

上記のリンクは、それをより効率的な結合に変換する例を示しています。

于 2012-11-21T18:08:55.897 に答える
0
select * from test
where address_type = "shipto"
union
select * from test t1
where address_type = "billto"
and (select count(*) from test t2 where t2.order_id = t1.order_id group by order_id) = 1;

それがどれほど効率的かはわかりませんが、確かにあなたの結果が得られます。パフォーマンスを他の方法と一致させることができます。

于 2012-11-21T18:21:30.697 に答える