1

簡潔にするために、次のようなテーブルがあるとしましょう。

item_name    item_location    item_price
PROMO_A      local            5
B            local            7
PROMO_A      global           8

ここで、私が行っているのは、item_locationが「local」であるか、「item_namecontains」という単語PROMOitem_location「local」ではないすべてのレコードを選択することです。これは、私のSQLクエリでは簡単に見えます。

SELECT * FROM mytable WHERE item_location='local' OR (item_name like 'PROMO%' AND item_location != 'local');

さて、上記で設定したサンプルデータのように、2つの同一item_nameのデータを取得する可能性があるので、後者のクエリが追加されないようにこのクエリを修正するにはどうすればよいでしょうか。レコードを調べて重複を削除するPHPプログラムを作成することでこれを修正できます(item_location =='global'を持つ重複(同じitem_nameを持つもの)を削除する必要があります)が、これが可能かどうか疑問に思っていましたSQLだけを使用して行われますか?上記のクエリの一時テーブルを作成してから、個別のitem_nameレコードをクエリすることを考えていましたが、その場合、item_location'global'のレコードを削除するにはどうすればよいですか?

とにかく、どんな助けも大歓迎です。

編集:このためのSQLフィドルリンクを設定しました。

edit2:次のクエリでこれを機能させることができました:

SELECT * FROM mytable WHERE item_location ='local'

連合

SELECT * FROM mytable WHERE item_name LIKE'PROMO%' AND item_name NOT IN
(SELECT item_name from mytable WHERE item_location ='local')

そして、このためのSQLフィドルリンクはここにあります。

さて、これはもっとうまく処理できると思いますので、誰かがもっと良いアプローチをしてくれたら、あなたの考えを聞いてみたいと思います。

4

1 に答える 1

1

クエリUNIONは次のように簡略化できます

SELECT * FROM mytable
WHERE item_location = 'local'
OR item_name LIKE 'PROMO%' AND item_name NOT IN
   (SELECT item_name FROM mytable
    WHERE item_location = 'local' )

LEFT JOINサブクエリの代わりに同じ結果を与える別のクエリは次のとおりです。

SELECT mt.* FROM mytable AS mt
LEFT JOIN mytable as mt2
ON mt2.item_name = mt.item_name      -- check for similar items
AND mt2.item_location = 'local'      -- whose location is 'local'
WHERE mt.item_location = 'local'
OR mt.item_name LIKE 'PROMO%'
AND mt2.item_location IS NULL;       -- only include if not found locally
于 2013-03-27T22:38:24.730 に答える