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;
      
      






All Articles