我有一个表articles
,其列的类型为SET
,名为categories
。
我们假设它接受来自cat1, cat2, cat3, cat4
集的值。这是一个直观的表示:
articleTitle | categories (of type SET) | ID
--------------------------------------------
Socializing | cat1 | 1
Programming | cat1,cat2 | 2
Sports | cat1,cat2,cat3 | 3
Hiking | cat2 | 4
Nutrition | cat1 | 5
Health | cat1,cat2,cat4 | 6
1。我想做一个SQL select
来返回val1
参数匹配的第一个 n 行的文章名称来自categories
列的值。 例如: if val1=cat1
然后结果为Socializing, Programming, Sports, Nutrition, Health
;
2. 我还想进行一次SQL select
查询,以确定val1, val2
是否与categories
列中的两个值匹配。 例如: if val1=cat1 AND val2=cat2
然后结果为Programming, Sports, Health
;
3。最后,最理想的做法是返回categories
中匹配次数最多的 n 行的第一行 n 行column - 表示总匹配取代部分匹配,而值列表中的第一个匹配优先于第二个匹配。 例如: if val1=cat1 AND val2=cat2 AND val3=cat3 AND numerOfRows=4
然后结果为Sports, Programming, Health, Socializing
;
我将如何做到这一点?它甚至是可能还是我需要运行多个查询 - 我想在多个查询场景中,计数和匹配逻辑将留给事物的后端,我一次做一件事情?很想在前两种情况下获得帮助。
如果有澄清要求,请询问并我将修改问题。
答案 0 :(得分:1)
重读问题后编辑,现在正确。下面的SQL小提琴: http://sqlfiddle.com/#!9/65c5b/7
问题1:
SELECT * FROM articles WHERE categories like '%a%' LIMIT 0, 5;
问题2:
SELECT * FROM articles WHERE categories like '%a,b%';
问题3:
SELECT * FROM articles WHERE categories LIKE '%a%' or
categories LIKE '%b%' or
categories LIKE '%c%' or
categories LIKE '%d%'
order by FIND_IN_SET('a',categories )
+ FIND_IN_SET('b',categories )
+ FIND_IN_SET('c',categories )
+ FIND_IN_SET('d',categories ) desc
LIMIT 0, 5;
我从变量中省略了实际的CONCAT函数,因为我不知道这是在php,sql还是其他应用程序中,但我认为它绝对足以得到它的主旨。如果不是,请告诉我。