2016-07-20 6 views
0

スフィンクスデータをフィルタリングする方法:スフィンクスに

+----------+-------------+-------------+ 
| id  | car_id  | filter_id | 
+----------+-------------+-------------+ 
| 37280991 |  4261 |   46 | 
| 37280992 |  4261 |   18 | 
| 37281000 |  4261 |   1 | 
| 37281002 |  4261 |   28 | 
| 51056314 |  4277 |   18 | 
| 51056320 |  4277 |   1 | 
| 51056322 |  4277 |   28 | 
+----------+-------------+-------------+ 

私は車を表示ページを持っていて、フィルタを適用することができます。私は、スフィンクスがフィルター1と46を持っている車を返そうとしています。上記の表を見れば、ただ一つの車(4261)に両方のフィルターがあることがわかります。問題は、スフィンクスでこれをどのように適用するのか分かりません。

$this->cs->SetFilter('filter_id', array(1, 46)); // this don't work because show me both(4261, 4277) cars, because work like a "in" 
$this->cs->SetGroupBy('car_id', SPH_GROUPBY_ATTR); 

答えて

0
$this->cs->SetFilter('filter_id', array(1)); 
$this->cs->SetFilter('filter_id', array(46)); 

両方のフィルタが適用され、そして両方が一致する必要があります。実際に彼らは「AND」されています。

+0

すべてのレコードに1つのフィルタしかないため、フィルタは一致しません。このようにコードを適用すると、 $ this-> cs-> SetFilter( 'filter_id'、array(1)); $ this-> cs-> SetFilter( 'filter_id'、array(46)); これは次のレコードで検索しようとします 37280991 | 4261 | 4 6 46と1です。したがって、これは無効です。 – wipcrep

0

疑問が誤っていると思われ、グループを使用して事実を逃した。 MVAを使って考えてみましょう。

...もう少し創造的でなければなりません。 AlasはおそらくSphinxAPIではなくSphinxQLを使用する必要があります。 sphinxQLがHAVING

SELECT id,car_id FROM index WHERE filter_id IN (1,46) GROUP BY car_id HAVING COUNT(*)>1 

を持っているので、これは唯一の車ごとに複数のドキュメントが一致する場合(つまり、IN句を使用するたびに一致する行が含まれています。filter_id = 1を持つ2つの列のような重複(があることができれば、おそらく代わりにCOUNT(DISTINCT filter_id)を使用することができます?)

+0

ありがとう!これは私のために便利です – wipcrep

関連する問題