sql set类型匹配

时间:2015-06-18 15:40:13

标签: mysql sql

我有一个表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;

我将如何做到这一点?它甚至是可能还是我需要运行多个查询 - 我想在多个查询场景中,计数和匹配逻辑将留给事物的后端,我一次做一件事情?很想在前两种情况下获得帮助。

如果有澄清要求,请询问并我将修改问题。

1 个答案:

答案 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还是其他应用程序中,但我认为它绝对足以得到它的主旨。如果不是,请告诉我。