我有一个带有以下列的 Sphinx 索引
id | 文章_id | 国家/地区_id |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 2 | 2 |
5 | 2 | 3 |
6 | 3 | 4 |
7 | 4 | 1 |
8 | 4 | 2 |
9 | 5 | 1 |
我需要获取完全不包含country_id = 1的article_ids,因此2和3。
问题是 Sphinx 不支持联接,也不支持子查询,所以我只能创建一个简单的选择查询,而不是 2 和 3,我得到 1、2、3、4,实际上只排除了 5。
有没有办法在 Sphinx 中构建一个返回 2 和 3 的查询?
简化的 Sphinx 索引如下所示:
sql_query_pre = SET @a := 0;
sql_query = \
\
SELECT \
@a := @a + 1 AS id, \
ase.id AS search_id, \
ase.name, \
ase.article_id, \
af.country_id, \
FROM articles_search ase \
LEFT JOIN articles a ON a.id = ase.article_id \
LEFT JOIN affiliation_article aa ON aa.article_id = ase.article_id \
LEFT JOIN affiliations af ON aa.affiliation_id = af.id \
sql_attr_bigint=country_id
sql_attr_bigint=article_id
}
查询是
SELECT article_id, WEIGHT() w FROM articles WHERE MATCH('(@name nasicon)') AND country_id != 9 GROUP BY article_id ORDER BY w DESC LIMIT 0, 15 OPTION max_matches = 200
似乎是一个明确的案例
HAVING
SELECT article_id, WEIGHT() w, SUM(country_id = 1) AS has1
FROM articles
WHERE MATCH('(@name nasicon)')
GROUP BY article_id
HAVING has1 = 0
ORDER BY w DESC
LIMIT 0, 15 OPTION max_matches = 200
SUM 计算组(即文章)中所有行中的
country=1
,并且仅返回文章中没有国家 = 1 文档的行。