SphinxQLでのOR句の実装

SQLに似た言語のSphinxQLは、「WHERE」句の「OR」句をまだサポートしていません。 つまり、検索インデックスをクエリするとき、次のような記述はできません。

SELECT * FROM `goods_index` WHERE `price` > 100 OR `price` = 0; 
100 tugriksを超える価格のすべての商品をインデックスから選択するか、価格が指定されていない場合

しかし、もちろん、解決策があります:計算を使用します。 私が思いついた例のリクエストを次のように書き直します。

 SELECT *, IF(`price` > 100, 1, 0) + IF(`price` = 0, 1, 0) AS `pricematch` FROM `goods_index` WHERE `pricematch` = 1; 

pricematch Theは、価格が100以上またはゼロに等しい場合、価格一致は常に1になり、レコードが一致するかどうかを確認するには、 pricematch一致pricematch 1に等しいかどうかを確認するだけで十分です。

SphinxQLおよび従来のSQLクエリでこのような計算を使用すると、クエリが「または」条件を必要とする他の状況で状況から抜け出すことができます。

更新します。

コメントのartifexは、SELECTステートメントでORを使用して、より透明で読みやすいオプションを提供します。

 SELECT *, (`price` > 100 OR `price` = 0) AS `pricematch` FROM `goods_index` WHERE `pricematch` > 0; 


アップデート2。

問題に直面しました:データベースのインデックス付き属性はBIGINT型です。 Sphinxは、設定で次のように記述されています
 sql_attr_bigint = myattr 


同時に、そのようなリクエストは希望する結果をもたらさず、空のセットを返します:

 SELECT * FROM index WHERE myattr > 87124599823547; 


「or」条件と同様に、式をSELECTセクションに移動すると役立ちました。

 SELECT *, ( myattr > 87124599823547 ) AS attrmatch FROM index WHERE attrmatch = 1; 

Source: https://habr.com/ru/post/J195918/


All Articles