2010-08-03 6 views
0

У меня есть таблица с именем и типом поля. Поле типа содержит музыкальный вкус человека, таким образом:Как я могу отфильтровать эти данные из моей базы данных?

«Рок; Поп Металл; Танец» (VARCHAR)

Мне нужно создать список первенствовать с этим лицами, сгруппированных по музыкальному вкусу.

Например:

  1. один список со всеми, в Rock; Металл; Танец
  2. Другой со всеми в Рок; Металл; Транс
  3. Другой с Рок (Rock) Только
  4. и так далее ...

Каждый пользователь может быть только в одном списке. Мне нужен этот список для импорта в моем программном обеспечении для рассылки новостей. Каждый тип - это список рассылки.

Мне нужно выполнить всевозможные комбинации, а затем создать список, когда получите результаты. Мне было интересно, какой из них лучший и быстрый способ сделать это. Может быть вызван PHP-скриптом или даже просто SQL.

Ps .: Мне нужны эти данные из старой базы данных, созданной кем-то еще. Я согласен, это ужасный способ хранить.

+8

Хотя это не ответ на ваш вопрос, вы должны рассмотреть возможность нормализации базы данных. –

+0

Возможно ли, чтобы струна была «Metal, Rock, Dance»? Разве это отличается от «Rock, Metal, Dance»? Всегда ли это точный формат или пробелы, иногда отсутствующие, иногда запятые вместо полуколоней и т. Д.? –

+0

Мне нужны эти данные из старой базы данных, созданной кем-то еще. Я согласен, это ужасный способ хранить. Порядок, похоже, всегда одинаковый. В этом случае, подумав об этом, кажется, что GROUP BY создаст все списки.Если нет, я могу использовать ORDER BY, а затем разделить, как сказал Скотт. –

ответ

2

Мне кажется, что вы могли бы запустить этот простой запрос:

SELECT * FROM table_name ORDER BY music_taste_field 

, а затем разделить результат, когда значение music_taste_field изменений. Вы можете сделать это вручную или на PHP.

Кроме того, как комментирует кто-то другой, это ужасный способ хранения музыкальных предпочтений.

0

И еще один неправильный дизайн базы данных (был аналогичным вопросом сегодня).

Прежде всего, для любых будущих операций все перечисления в вашей базе данных должны быть отдельными реляционными структурами (например, таблицы). Таким образом было бы очень легко создать эти списки, используя индексированные поля.

Теперь вы будете называть функции манипулирования строкой, которые работают медленно, как ад, забывают о индексах, что оставляет вас примерно в 100 раз медленнее выполняющего запроса и менее достоверных данных. Вот почему ведет неправильный дизайн базы данных.

После замены точки с запятой вы можете использовать что-то вроде find_in_set(), но это извращение.
Лучшим решением является переработка базы данных, если потребуются дополнительные запросы этого типа.

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