Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Вопрос по логике сортировки БД
Покинул форум
Сообщений всего: 43
Дата рег-ции: Дек. 2010
Помог: 0 раз(а)
Подскажите логику.
Есть некий список композиторов (строки в таблице) в БД MySql:
Фамилия композитора
Раздел
Для пользователей будет возможность сортировки либо по фамилии либо по разделу.
Проблема в том, что одна фамилия может быть отнесена к 2-м разделам сразу или к 1-му.
Если в БД я напишу в одной строке 2 названия разделов, то как же организовать сортировку по разделам?
Саныч
Отправлено: 27 Марта, 2011 - 22:53:44
Участник
Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010 Откуда: Украина, Запорожье
Помог: 62 раз(а)
вопрос в том как отсортировать сразу и по фамилии, и по разделу или что?
----- Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
HotBird
Отправлено: 27 Марта, 2011 - 23:11:11
Гость
Покинул форум
Сообщений всего: 114
Дата рег-ции: Сент. 2010
Помог: 2 раз(а)
mikpankov пишет:
Если в БД я напишу в одной строке 2 названия разделов, то как же организовать сортировку по разделам?
Ненадо в одной строке два названия раздела писать.
Организуйте БД так:
----- Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев. Качественный хостинг по доступной цене
mikpankov
Отправлено: 27 Марта, 2011 - 23:28:05
Новичок
Покинул форум
Сообщений всего: 43
Дата рег-ции: Дек. 2010
Помог: 0 раз(а)
HotBird пишет:
Ненадо в одной строке два названия раздела писать.
Организуйте БД так:
Покинул форум
Сообщений всего: 114
Дата рег-ции: Сент. 2010
Помог: 2 раз(а)
Очень желательно чтобы вы реорганизовали БД.
Но если такой возможности нет, тогда задача сортировки значительно усложняется и займёт больше времени на исполнение. Вам надо читать все строки из таблицы, загонять их в масив и приэтом строки вида Композитор1 Раздел1 Раздел2 експлодить в две строки Композитор1 Раздел1
Композитор1 Раздел2
А после этого сортировать масив по ключу Раздел, и тогда выдавать пользователю.
----- Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев. Качественный хостинг по доступной цене
mikpankov
Отправлено: 28 Марта, 2011 - 00:04:15
Новичок
Покинул форум
Сообщений всего: 43
Дата рег-ции: Дек. 2010
Помог: 0 раз(а)
HotBird пишет:
Очень желательно чтобы вы реорганизовали БД.
Но если такой возможности нет, тогда задача сортировки значительно усложняется и займёт больше времени на исполнение. Вам надо читать все строки из таблицы, загонять их в масив и приэтом строки вида Композитор1 Раздел1 Раздел2 експлодить в две строки Композитор1 Раздел1
Композитор1 Раздел2
А после этого сортировать масив по ключу Раздел, и тогда выдавать пользователю.
БД пока пуста. Я пока только планирую. Как нужно реорганизовывать?
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
mikpankov пишет:
Как нужно реорганизовывать?
Итого, задача:
0) есть несколько разделов.
1) есть несколько композиторов
2) каждый композитор может относиться к нескольким разделам.
Это типичная связь многие-ко-многим, в реляционных базах (к которым и относится mysql) эта задача реализуется так:
таблица разделов: id_раздела, др. данные, относящиеся к этому разделу, кроме композиторов
таблица композиторов: id_композитора, др. данные,кроме разделов
таблица связей: id_раздела, id_композитора, первичный ключ на оба поля.
На досуге почитайте теорию по реляционным базам данных, полезно
----- PostgreSQL DBA
mikpankov
Отправлено: 28 Марта, 2011 - 00:48:23
Новичок
Покинул форум
Сообщений всего: 43
Дата рег-ции: Дек. 2010
Помог: 0 раз(а)
Мелкий пишет:
mikpankov пишет:
Как нужно реорганизовывать?
На досуге почитайте теорию по реляционным базам данных, полезно
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
mikpankov пишет:
Проблема в том, что одна фамилия может быть отнесена к 2-м разделам сразу или к 1-му.
В качестве возможного варианта для достижения цели предполагаемой задачи, заключающеся в осуществлении извлечения группы информационных полей на основани указанного критерия, определение которого производится в качестве создания совмещения локальных информационных полей, допустимо использование декартового производения относительно целевых таблиц базы данных, на основании применения искомого условия совмещения извлекаемых элементов
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
mikpankov
Отправлено: 28 Марта, 2011 - 00:56:57
Новичок
Покинул форум
Сообщений всего: 43
Дата рег-ции: Дек. 2010
Помог: 0 раз(а)
JustUserR пишет:
mikpankov пишет:
Проблема в том, что одна фамилия может быть отнесена к 2-м разделам сразу или к 1-му.
В качестве возможного варианта для достижения цели предполагаемой задачи, заключающеся в осуществлении извлечения группы информационных полей на основани указанного критерия, определение которого производится в качестве создания совмещения локальных информационных полей, допустимо использование декартового производения относительно целевых таблиц базы данных, на основании применения искомого условия совмещения извлекаемых элементов
Самое умное. что могу ответить "ЫЫ lol") Просто я ничего не понял)
mikpankov
Отправлено: 28 Марта, 2011 - 11:05:42
Новичок
Покинул форум
Сообщений всего: 43
Дата рег-ции: Дек. 2010
Помог: 0 раз(а)
Мелкийt пишет:
Это типичная связь многие-ко-многим, в реляционных базах (к которым и относится mysql) эта задача реализуется так:
таблица разделов: id_раздела, др. данные, относящиеся к этому разделу, кроме композиторов
таблица композиторов: id_композитора, др. данные,кроме разделов
таблица связей: id_раздела, id_композитора, первичный ключ на оба поля.
На досуге почитайте теорию по реляционным базам данных, полезно
Нельзя ли сделать так?:
Таблица "Раздел1": id_композиторов_раздела_1
Таблица "Раздел2": id_композиторов_раздела_2
(7 разделов всего+вывод всех композиторов сразу)
Таблица Разделы: Название_раздела, id раздела
Или всё-таки лучше:
id раздела id композитора
1 1
1 2
1 50
2 2
2 4
2 51
И как же должна выглядеть таблица для посетителя, если, допустим, должен быть вывод всех композиторов по фамилиям, а в правом столбе прописаны имена разделов, в которых каждый из них состоит?
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
mikpankov пишет:
Нельзя ли сделать так?:
Можно, только зачем усложнять себе жизнь?
mikpankov пишет:
И как же должна выглядеть таблица для посетителя, если, допустим, должен быть вывод всех композиторов по фамилиям, а в правом столбе прописаны имена разделов, в которых каждый из них состоит?
Пара объединений таблиц и ещё чего-нибудь по вкусу (в зависимости от того, что и как выводить)
----- PostgreSQL DBA
mikpankov
Отправлено: 28 Марта, 2011 - 14:52:45
Новичок
Покинул форум
Сообщений всего: 43
Дата рег-ции: Дек. 2010
Помог: 0 раз(а)
Цитата:
Пара объединений таблиц и ещё чего-нибудь по вкусу (в зависимости от того, что и как выводить)
Видимо так:
На одной странице Посетитель будет видеть таблицу, где композиторы отсортированы по фамилиям:
Б
Борисов|Раздел1, Раздел 2
Г
Головко|Раздел 1
Х
Хренов|раздел 3, раздел 2
На другой странице будет вывод по разделу:
Страница с разделом 1
Б
Борисов
Г
Головко
Спасибо, теперь перехожу к созданию тестового набора таблиц в БД.
Вот, что мне нужно в бд, что я и создал, теперь пора заняться кодом... Прикреплено изображение (Нажмите для увеличения)
SELECT id_comp, name_comp FROM`имя таблицы связей`LEFTJOIN composers USING(id_comp)/*или вместо using (id_comp) поставить on `имя поля в таблице связей`=`имя поля id композитора` */WHERE`id_раздел`=1 ORDERBY name_comp
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.