This is the best I can think of:
SELECT * FROM myFts t1 JOIN (SELECT COUNT(*) AS cnt, id FROM myFts t2 WHERE t2.languageId in (1, 2) AND t2.myFts MATCH 'term' GROUP BY t2.id) t3 ON t1.id = t3.id WHERE t1.myFts MATCH 'term' AND t1.languageId in (1, 2) AND (t1.languageId = 1 or t3.cnt = 1)
I'm not sure what the second MATCH clause is required. The idea is to first calculate acceptable strings, and then choose the best one.
Change I have no idea why this is not working with your table. This is what I did to test it (SQLite version 3.8.10.2):
CREATE VIRTUAL TABLE myFts USING fts4( id integer, languageId integer, content TEXT ); insert into myFts(id, languageId, content) values (10, 1, 'term 10 lang 1'); insert into myFts(id, languageId, content) values (10, 2, 'term 10 lang 2'); insert into myFts(id, languageId, content) values (11, 1, 'term 11 lang 1'); insert into myFts(id, languageId, content) values (12, 2, 'term 12 lang 2'); insert into myFts(id, languageId, content) values (13, 1, 'not_erm 13 lang 1'); insert into myFts(id, languageId, content) values (13, 2, 'term 13 lang 2');
Execution of the request gives:
sqlite> SELECT * ...> FROM myFts t1 ...> JOIN (SELECT COUNT(*) AS cnt, id ...> FROM myFts t2 ...> WHERE t2.languageId in (1, 2) ...> AND t2.myFts MATCH 'term' ...> GROUP BY t2.id) t3 ...> ON t1.id = t3.id ...> WHERE t1.myFts MATCH 'term' ...> AND t1.languageId in (1, 2) ...> AND (t1.languageId = 1 or t3.cnt = 1); 10|1|term 10 lang 1|2|10 11|1|term 11 lang 1|1|11 12|2|term 12 lang 2|1|12 13|2|term 13 lang 2|1|13 sqlite>