2015-06-18 3 views
0

У меня есть таблица articles с колонкой типа SET по имени categories. Предположим, что он принимает значения от cat1, cat2, cat3, cat4. Вот визуальное представление:sql тип комплекта

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 совпадает с любым из значений в 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 колонки - означает общее количество матчей вытесняет частичные совпадения и первый матч с список значений имеет приоритет над вторым. например:if val1=cat1 AND val2=cat2 AND val3=cat3 AND numerOfRows=4, тогда результаты будут Sports, Programming, Health, Socializing;

Как я могу это сделать? Возможно ли это, или мне нужно запустить несколько запросов - я предполагаю, что в сценарии с несколькими запросами логика подсчета и сопоставления будет оставлена ​​во внутренней части вещей, и я бы сделал одну вещь за раз? Хотелось бы получить помощь в первых двух сценариях.

Если есть необходимость уточнения, спросите, и я исправлю вопрос.

+1

Хотелось бы, чтобы они никогда не думали о SET – Strawberry

ответ

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; 

Я опустил функцию acutal CONCAT от переменных потому что я не знаю, находится в php, sql или в каком-либо другом приложении, но я думаю, что это определенно достаточно, чтобы понять его. Дайте мне знать, если это не так.

+0

Это будет PHP. Я как бы понял логику, однако я не понимаю, что вы подразумеваете под функцией CONCAT (новая для SQL - действительно только знать основы). Я также смущен тем, что означает «% a%». Не могли бы вы объяснить? Я бы хотел это понять. –

+1

Спасибо за согласие, и никаких проблем! В моем примере я заменил «cat1, cat2» и т. Д. На «a, b», поэтому я надеюсь, что это не слишком смутило вас. Виноват. «% A%» означает «содержит ли мой набор« a »? Если так, верните эту строку». Concat - это оператор для объединения строки. Если вы используете PHP, не беспокойтесь об этом, так как вы создаете свой sql в строке. Поэтому вы можете сделать именно то, что у меня было здесь, где вместо «a» «b» «c» или «d» вставлены «cat1» или «cat2». Надеюсь это поможет. –

+0

Правильно, я понял сейчас. Спасибо! –

Смежные вопросы