2017-02-02 12 views
-1

データベース内で同様のキーワードを選択するクエリがあります。しかし、クエリでは、自分のIDを同様の推奨事項を見つけようとしているものとして選択しています。私はちょうど推薦し、重複したIDではありません。私は '!='と '<>'の後にプロダクトIDを試しましたが、これはそれを破るようです。MySQL同じクエリを選択しないクエリ

このため、ID 22とその類似製品を選択します。私はそれが22をピッキングしたくない。

+0

ポストいくつかのサンプルデータおよび所望の結果:

あなたは、クエリのパフォーマンスを向上させるためにこれらを見てみたいことがあります。 –

+0

'prodID!= 22 AND attributeID ... 'からのprodIDのSELECTを選択してください。 – miken32

+0

私はあなたが参加することでこれをもっと効率的に行うことができます。 – miken32

答えて

0

おそらく、私は質問を理解していなかったが、それは以下のように単純ではありません。

SELECT * 、IN PRODID (> 22 <をproidキーワードの中からPRODIDを選択))LIMIT 4 Productsから。

1

あなたが既に試したことは私にはっきりと分かりません。その説明は解釈を少し残す。これは、あなたが試したし、それがうまくいかなかった何かである場合、あなたはそれが動作しませんでしたどのように指定する必要があります

SELECT * 
    FROM products 
WHERE prodID IN (SELECT prodID 
        FROM keywords 
        WHERE attributeID IN (SELECT attributeID 
              FROM keywords a 
              WHERE prodID = 22 
             ) 
        AND prodID <> 22 
       ) 
LIMIT 4; 

:私はこのがすべき作品と言うことができます。 (エラーメッセージ?データが間違っている場合はどうすればよいですか?)

+0

あなたは参加について言う...これは簡単でしょうか? – Han

+0

これは、結合に基づいて書き直すことができます。どちらかというとパフォーマンスの問題が見られるのでなければ、私はそれがロジックの意図をより直感的に反映していると思われるものを使用します。 –

+0

もう一度結合を見てください。そして、ORDER BYのないLIMITはかなり無意味です。 – Strawberry

0

私は個人的にサブクエリを入れ子にするのが嫌いですが、その場合は 'prodID <> 22を追加して結果を得ることができますただLIMITの前に:

SELECT * FROM products WHERE prodID IN 
    (SELECT prodID FROM keywords WHERE attributeID IN 
    (SELECT attributeID FROM keywords a WHERE prodID = 22)) 
AND prodID <> 22 LIMIT 4; 

あなたがそれにバインドされていないなら、あなたはを使用することによって、より良い性能を達成できることを何卒ご了承下さいに参加する:

LEFT [OUTER] JOINのは、することができ同等のサブクエリよりも高速ですそれを最適化することができます。これは、MySQL Serverだけに特有のものではありません。

SQL-92より前では、外部結合は存在しなかったため、サブクエリは特定の処理を行う唯一の方法でした( )。現在、MySQLサーバや他の多くの モダンデータベースシステムは、幅広い外部結合タイプを提供しています。

https://dev.mysql.com/doc/refman/5.7/en/rewriting-subqueries.html