2016-09-08 23 views
1

私は製品検索に使用する検索機能に取り組んでいます。MySQLの通常のクエリと他のクエリとの異なる結果のクエリ

しかし、私がMySQLを使用しようとすると、別の結果が得られます。

tbl_productの表は、私は通常のクエリを使用する場合、それは1件の結果を与える42504

を使用して検索するときに、それは1件の結果を与える必要がありSKU番号pd_art 42504.

を持っている製品を持っている

SELECT * 
FROM tbl_product, tbl_suggetions 
WHERE 
(
    (tbl_product.pd_name LIKE '%42504%') OR 
    (tbl_product.pd_art LIKE '%42504%') OR 
    (tbl_product.pd_srkw LIKE '%42504%') OR 
    (tbl_suggetions.sgtexts LIKE '%42504%' AND 
    tbl_product.pd_id = tbl_suggetions.sgproduct) 
) AND pd_bestsell <> 1 
GROUP BY pd_id 
ORDER BY RAND() 

しかし、使用時には

を結果としてそれがその製品を与えるものではありません参加
SELECT * 
FROM tbl_product tbl_product 
JOIN tbl_suggetions tbl_suggetions 
    ON tbl_suggetions.sgproduct = tbl_product.pd_id 
WHERE 
(
    (tbl_product.pd_name LIKE '%42504%') OR 
    (tbl_product.pd_art LIKE '%42504%') OR 
    (tbl_product.pd_srkw LIKE '%42504%') OR 
    (tbl_suggetions.sgtexts LIKE '%42504%') 
) AND pd_bestsell <> 1 
GROUP BY pd_id 
ORDER BY RAND() 

私はこれを修正するのを手伝ってもらえますか?実際には、通常のクエリ実行よりも20倍も速いため、ジョインクエリを使用する必要があります。

tbl_product.pd_name LIKE '%42504%' OR 
tbl_product.pd_art LIKE '%42504%' OR 
tbl_product.pd_srkw LIKE '%42504%' 

私はあなたが切り替わるときと信じています。おかげで、あなたの最初のクエリで多く

+0

2つの非常に異なる結合を実行しています(異なる結果)どちらの結果が欲しいですか? (私は2番目のクエリが正しいと思います。) – jarlh

+1

参加を控えてください。 2番目のテーブルに一致しないものを含む結果が表示されます。それはその特定のpd_artのために参加することはできませんことができるでしょう – James

+0

@ jarlh私は1つの結果が必要です、正しい結果は最初のクエリによって与えます –

答えて

2

は、レコードが参加し、以下の条件の下でないマッチアップはしなかった場合でも、結果セット内に保持されるだろうINNER JOIN(2番目のクエリ)にスキュー番号pd_art 42504のレコードは、提案がないため除外されています。 (私は投稿する前に@Jamesは瞬間を述べたように)、このレコードを保持する1つのオプションは、2つのテーブルLEFT JOINに次のようになります。

SELECT * 
FROM tbl_product tbl_product 
LEFT JOIN tbl_suggetions tbl_suggetions 
    ON tbl_suggetions.sgproduct = tbl_product.pd_id 
WHERE 
(
    tbl_product.pd_name LIKE '%42504%' OR 
    tbl_product.pd_art LIKE '%42504%' OR 
    tbl_product.pd_srkw LIKE '%42504%' OR 
    tbl_suggetions.sgtexts LIKE '%42504%' 
) AND pd_bestsell <> 1 
GROUP BY pd_id 
ORDER BY RAND() 

この仮説が正しい場合は、tbl_suggetionsからあなたの一致するレコードのすべての列テーブルはNULLである必要があります。

+0

私はLEFT JOINを使用しましたが、クエリを実行するのに約6-10秒かかりました。参加するときは1秒未満で参加します。 –

+1

@SunethKalhara LEFT JOINを実行すると左のテーブル全体をスキャンする必要がありますが、INNER JOINのレコードは破棄できます。それにかかわらず、大きな問題は、結合列にインデックスを設定していない可能性があることです。インデックスを作成しましたか? –

+0

あなたはインデックスを意味します:) –

0

通常のクエリを結合に変換します。それはのように見えるはずです。

SELECT * FROM tbl_product tbl_product 
JOIN tbl_suggetions tbl_suggetions 
ON tbl_suggetions.sgproduct=tbl_product.pd_id AND tbl_suggetions.sgtexts LIKE '%42504%' 
WHERE ((tbl_product.pd_name LIKE '%42504%') 
OR (tbl_product.pd_art LIKE '%42504%') 
OR (tbl_product.pd_srkw LIKE '%42504%')) 
AND pd_bestsell <> 1 
GROUP BY pd_id 
ORDER BY RAND() 
関連する問題