Задавайте вопросы, мы ответим
Вы не зашли.
В общем случае задача сводится к определению, есть ли перекрывающиеся значения в двух строках типа SET.
Пусть первая строка выглядит как 'a,c,h', а вторая как 'b,h,g,i,w'. Есть ли встроенная функция, которая вернет 1, если в этих строках встречаются одинаковые значения (в данном примере это h), и 0, если нет. Спасибо!
Отредактированно Retrill (08.01.2011 22:37:23)
Неактивен
Думал-думал, и сам решил. Вот такой вариант:
Пусть есть таблица:
Отредактированно Retrill (08.01.2011 23:17:11)
Неактивен
А почему Вы не хотите нормализовать данные, и хранить список курсов, на которые
подписан человек, в отдельной таблице? SET никогда не подразумевался как тип
для поля, по которому будут искать.
В качестве бонуса получите возможность легко добавить еще один курс, не перекра-
ивая всю таблицу
Ах, да, и, конечно, Вы перемудрили с выражением, можно было написать просто
WHERE a & b — это же просто наборы битов.
P.S. Но если хотите остаться в рамках SETов — можете сделать некоторый костыль
(но я всё-таки советую нормализованную схему!):
WHERE a IN ('mat', 'bio,mat', 'bio,mat,psy', ...) — выражение будет сложнее, но
зато сможет использовать индекс.
Неактивен
paulus написал:
А почему Вы не хотите нормализовать данные, и хранить список курсов, на которые
подписан человек, в отдельной таблице? SET никогда не подразумевался как тип
для поля, по которому будут искать.
В качестве бонуса получите возможность легко добавить еще один курс, не перекра-
ивая всю таблицу
Хм... Не совсем понял идею.
Допустим, делаю вторую таблицу, как вы и говорите, где храню список спецкурсов. Вы имеете в виду примерно следующую:
paulus написал:
Но если хотите остаться в рамках SETов — можете сделать некоторый костыль
(но я всё-таки советую нормализованную схему!):
WHERE a IN ('mat', 'bio,mat', 'bio,mat,psy', ...) — выражение будет сложнее, но
зато сможет использовать индекс.
Я же не знаю, какой набор курсов будет у данного пользователя, придется формировать эту строку динамически с использованием prepared statements. Сложновато получится.
Отредактированно Retrill (09.01.2011 13:33:52)
Неактивен
Еще подумав насчет запроса, написал вот такой:
Отредактированно Retrill (09.01.2011 21:59:45)
Неактивен
А какие индексы добавили? И EXPLAIN от запроса покажите, пожалуйста.
Неактивен
paulus написал:
А какие индексы добавили? И EXPLAIN от запроса покажите, пожалуйста.
Таблица users: индекс по (user_id);
Таблица events: индекс по (event_id);
Таблица selected_courses: 2 индекса по (user_id),(course_id);
Таблица restricted_courses: 2 индекса по (event_id),(course_id);
Индексы по нескольким полям не использовались, ибо непонятно мне, какие индексы тут вообще нужны.
Отредактированно Retrill (10.01.2011 21:42:21)
Неактивен
Хорошо, убедили, в этом случае действительно читать одну таблицу быстрее, чем
несколько. Скорее всего, вообще в случае «все, кроме нескольких» Вы будете
выигрывать на одной таблице. Даже если запрос правильно переписать так, чтобы
он был независимым.
Неактивен