SQLite喜欢查询多行

时间:2013-04-02 14:30:46

标签: iphone sql sqlite

我有下表

---------------------------------------
id,     type,     keyword,     default
---------------------------------------
1,      1,        mcdonalds,       1
2       1,        food,            0
3,      1,        drinks,          0
4,      2,        vending machine, 1
5,      2,        drinks,          0
6,      3,        station,         1
7,      3,        travel,          0
8       3,        train,           0

这背后的想法是我想要一个serach查询为关键字(默认行)提供“唯一”类型,所以当我搜索mcdonalds时,我得到第一行,但是当我搜索食物或饮料时,我也得到了第一行。

我使用了一个子选择。

SELECT type, keyword FROM keywords WHERE type IN (SELECT DISTINCT type FROM keywords WHERE keyword like '%?%') AND `default`=1
;

这就像一个魅力,但现在我希望能够提供多个关键字,例如“饮料和食物”我试过了

SELECT type, keyword FROM keywords WHERE type IN (SELECT DISTINCT type FROM keywords WHERE keyword like '%?%' OR keyword like'%?%') AND `default`=1
;

但是当我在这种情况下搜索“食物和饮料”时,我会得到“自动售货机”和“麦当劳”。然而,自动售货机只有一个相关的关键词“饮料”(它不提供任何食物)所以我不想在我的结果中使用那个。

当我做'AND'而不是OR时,我根本没有得到任何结果(因为一行不能同时具有两个值)。

有没有人对如何解决这个问题有任何建议?

3 个答案:

答案 0 :(得分:1)

/*
t = keywords
*/

SELECT *
FROM t
WHERE type IN (
    SELECT type
    FROM (
        SELECT COUNT(id) AS count_matches,
            type
        FROM t
        WHERE keyword LIKE '%drinks%'
        OR  keyword   LIKE '%food%'
        GROUP BY type
        )
        q
    ORDER BY count_matches DESC 
    LIMIT 1
    )
AND "default" = 1

答案 1 :(得分:1)

使用两个独立的子查询,然后将查找与AND

组合在一起
SELECT type,
       keyword
FROM keywords
WHERE type IN (SELECT DISTINCT type FROM keywords WHERE keyword like '%drinks%')
  AND type IN (SELECT DISTINCT type FROM keywords WHERE keyword like '%food%')
  AND "default"=1

答案 2 :(得分:0)

好的,谢谢你的帮助。它已被弄清楚了! :)

 SELECT type, keyword FROM keywords WHERE type IN 
 (SELECT type FROM keywords WHERE (`keyword` LIKE '%drinks%' OR keyword like '%food%') AND `default`!= 1 GROUP BY type HAVING COUNT(id) >= 2)
 AND `default`=1

可以动态构建查询,因此它使用COUNT。子查询中返回的计数行数必须至少与用户输入的关键字数一样多。

[b]编辑似乎不起作用,或者像有时会提供比预期更高的计数[/ b]