我有下表
---------------------------------------
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时,我根本没有得到任何结果(因为一行不能同时具有两个值)。
有没有人对如何解决这个问题有任何建议?
答案 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]