web-verzus-team
@web-verzus-team
Full Stack Developer

Выбрать из таблицы MySQL по одинаковым значениям полей. Как лучше?

Есть таблица учеников:
id|name|addr|langs|times|ages
1|Иван|Киев;Москва|рус;укр|пн;пт|4
2|Петр|Харьков;Москва|рус|пт|4
3|Олег|Рига|рус;лит|пн;вт|5
.......
и т.д.

Из этих данных нужно собрать группу- т.е. выбрать из базы учеников с:
1. Одним городом(пример: Москва - подходят Иван и Петр)
2. Одним языком(пример: рус - все подходят)
3. Одним днем недели(аналогично)
4. Одним возрастом.
Один момент: Если идет "подбор" по Москве, например, то подойдут те, у которых указан город Москва+ могут "иметь" и другие города. Также и по другим полям
Как тут лучше поступить? А то пока в голову приходят только идиотские решения
  • Вопрос задан
  • 197 просмотров
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
В таком виде толком никак. Для начала нормализуйте таблицу, вынесите города и языки в связанные таблицы, дни недели из текстовой строки преобразуйте в тип данных SET. Тогда поиск будет простым и понятным.
Ответ написан
@Joysi75
Полностью согласен с Rsa97. Но если нельзя менять структуру БД и нормализовать ее, то ищите по вхождению подстроки в строку:
1)
select * from table where instr ( concat(';',addr,';'),';Москва;') > 0

2)
select * from table where instr ( concat(';',lang,';'),';рус;') > 0

3)
select * from table where instr ( concat(';',times,';'),';пт;') > 0

и т.д. ';' обнесены, чтобы исключить например попадания Нью-Йорк вместо Йорк и т.п.
Но все это жутко(даже бешено) неправильно по структуре и сильно увеличивает шанс хранения ошибочных данных и т.п.
1) Переименуйте поля (addr -> city, times -> dayofweek и т.п.).
2) Создайте таблицы справочники и сделайте внешний ключ на них
3) Используйте правильный тип строки (очень плохо хранить все в текстовом виде, особенно ограниченные множества.)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы