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 :: Вопрос по логике сортировки БД

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Описание: Логика сортировки по раздделам.
mikpankov
Отправлено: 27 Марта, 2011 - 22:47:47
Post Id


Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




Подскажите логику.
Есть некий список композиторов (строки в таблице) в БД MySql:
Фамилия композитора
Раздел

Для пользователей будет возможность сортировки либо по фамилии либо по разделу.
Проблема в том, что одна фамилия может быть отнесена к 2-м разделам сразу или к 1-му.
Если в БД я напишу в одной строке 2 названия разделов, то как же организовать сортировку по разделам?
 
 Top
Саныч Модератор
Отправлено: 27 Марта, 2011 - 22:53:44
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




вопрос в том как отсортировать сразу и по фамилии, и по разделу или что?


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
HotBird
Отправлено: 27 Марта, 2011 - 23:11:11
Post Id



Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Сент. 2010  


Помог: 2 раз(а)




mikpankov пишет:
Если в БД я напишу в одной строке 2 названия разделов, то как же организовать сортировку по разделам?

Ненадо в одной строке два названия раздела писать.
Организуйте БД так:

Композитор1 Раздел1
Композитор2 Раздел1
Композитор3 Раздел2
Композитор4 Раздел3
Композитор5 Раздел3
и т.д.


-----
Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев.
Качественный хостинг по доступной цене
 
 Top
mikpankov
Отправлено: 27 Марта, 2011 - 23:28:05
Post Id


Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




HotBird пишет:

Ненадо в одной строке два названия раздела писать.
Организуйте БД так:

Композитор1 Раздел1
Композитор2 Раздел1
Композитор3 Раздел2
Композитор4 Раздел3
Композитор5 Раздел3
и т.д.


А если у меня так?
Композитор1 Раздел1 Раздел2
Композитор2 Раздел 1
Композитор3 Раздел 2

И при этом надо сортировать по разделам

(Отредактировано автором: 27 Марта, 2011 - 23:29:11)

 
 Top
HotBird
Отправлено: 28 Марта, 2011 - 00:03:22
Post Id



Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Сент. 2010  


Помог: 2 раз(а)




Очень желательно чтобы вы реорганизовали БД.
Но если такой возможности нет, тогда задача сортировки значительно усложняется и займёт больше времени на исполнение. Вам надо читать все строки из таблицы, загонять их в масив и приэтом строки вида Композитор1 Раздел1 Раздел2 експлодить в две строки
Композитор1 Раздел1
Композитор1 Раздел2

А после этого сортировать масив по ключу Раздел, и тогда выдавать пользователю.


-----
Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев.
Качественный хостинг по доступной цене
 
 Top
mikpankov
Отправлено: 28 Марта, 2011 - 00:04:15
Post Id


Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




HotBird пишет:
Очень желательно чтобы вы реорганизовали БД.
Но если такой возможности нет, тогда задача сортировки значительно усложняется и займёт больше времени на исполнение. Вам надо читать все строки из таблицы, загонять их в масив и приэтом строки вида Композитор1 Раздел1 Раздел2 експлодить в две строки
Композитор1 Раздел1
Композитор1 Раздел2

А после этого сортировать масив по ключу Раздел, и тогда выдавать пользователю.


БД пока пуста. Я пока только планирую. Как нужно реорганизовывать?

(Отредактировано автором: 28 Марта, 2011 - 00:13:02)

 
 Top
Мелкий Супермодератор
Отправлено: 28 Марта, 2011 - 00:46:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




mikpankov пишет:
Как нужно реорганизовывать?

Итого, задача:
0) есть несколько разделов.
1) есть несколько композиторов
2) каждый композитор может относиться к нескольким разделам.

Это типичная связь многие-ко-многим, в реляционных базах (к которым и относится mysql) эта задача реализуется так:
таблица разделов: id_раздела, др. данные, относящиеся к этому разделу, кроме композиторов
таблица композиторов: id_композитора, др. данные,кроме разделов
таблица связей: id_раздела, id_композитора, первичный ключ на оба поля.

На досуге почитайте теорию по реляционным базам данных, полезно Подмигивание


-----
PostgreSQL DBA
 
 Top
mikpankov
Отправлено: 28 Марта, 2011 - 00:48:23
Post Id


Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




Мелкий пишет:
mikpankov пишет:
Как нужно реорганизовывать?

На досуге почитайте теорию по реляционным базам данных, полезно Подмигивание

Спасибо! Пошёл учить "р-е-л-я-ц-и-о-н-н-ы-е базы... Не понял
 
 Top
JustUserR
Отправлено: 28 Марта, 2011 - 00:55:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




mikpankov пишет:
Проблема в том, что одна фамилия может быть отнесена к 2-м разделам сразу или к 1-му.
В качестве возможного варианта для достижения цели предполагаемой задачи, заключающеся в осуществлении извлечения группы информационных полей на основани указанного критерия, определение которого производится в качестве создания совмещения локальных информационных полей, допустимо использование декартового производения относительно целевых таблиц базы данных, на основании применения искомого условия совмещения извлекаемых элементов


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
mikpankov
Отправлено: 28 Марта, 2011 - 00:56:57
Post Id


Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




JustUserR пишет:
mikpankov пишет:
Проблема в том, что одна фамилия может быть отнесена к 2-м разделам сразу или к 1-му.
В качестве возможного варианта для достижения цели предполагаемой задачи, заключающеся в осуществлении извлечения группы информационных полей на основани указанного критерия, определение которого производится в качестве создания совмещения локальных информационных полей, допустимо использование декартового производения относительно целевых таблиц базы данных, на основании применения искомого условия совмещения извлекаемых элементов


Самое умное. что могу ответить "ЫЫ lol") Просто я ничего не понял)
 
 Top
mikpankov
Отправлено: 28 Марта, 2011 - 11:05:42
Post Id


Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




Мелкийt пишет:

Это типичная связь многие-ко-многим, в реляционных базах (к которым и относится mysql) эта задача реализуется так:
таблица разделов: id_раздела, др. данные, относящиеся к этому разделу, кроме композиторов
таблица композиторов: 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

И как же должна выглядеть таблица для посетителя, если, допустим, должен быть вывод всех композиторов по фамилиям, а в правом столбе прописаны имена разделов, в которых каждый из них состоит?

(Отредактировано автором: 28 Марта, 2011 - 11:10:09)

 
 Top
Мелкий Супермодератор
Отправлено: 28 Марта, 2011 - 12:08:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




mikpankov пишет:
Нельзя ли сделать так?:

Можно, только зачем усложнять себе жизнь?

mikpankov пишет:
И как же должна выглядеть таблица для посетителя, если, допустим, должен быть вывод всех композиторов по фамилиям, а в правом столбе прописаны имена разделов, в которых каждый из них состоит?

Пара объединений таблиц и ещё чего-нибудь по вкусу (в зависимости от того, что и как выводить)


-----
PostgreSQL DBA
 
 Top
mikpankov
Отправлено: 28 Марта, 2011 - 14:52:45
Post Id


Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




Цитата:
Пара объединений таблиц и ещё чего-нибудь по вкусу (в зависимости от того, что и как выводить)

Видимо так:
На одной странице Посетитель будет видеть таблицу, где композиторы отсортированы по фамилиям:
Б
Борисов|Раздел1, Раздел 2
Г
Головко|Раздел 1
Х
Хренов|раздел 3, раздел 2

На другой странице будет вывод по разделу:
Страница с разделом 1
Б
Борисов
Г
Головко

Спасибо, теперь перехожу к созданию тестового набора таблиц в БД.

Вот, что мне нужно в бд, что я и создал, теперь пора заняться кодом...
Прикреплено изображение (Нажмите для увеличения)
php.su_post1283174493.png

(Отредактировано автором: 28 Марта, 2011 - 16:40:57)

 
 Top
mikpankov
Отправлено: 28 Марта, 2011 - 18:07:06
Post Id


Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




Задачи:
а) Вывести всех композиторов
-Рассортировать фамилии по алфавиту
б) Вывести композиторов из раздела 1
-Рассортировать фамилии по алфавиту

Решение:
PHP:
скопировать код в буфер обмена
  1. mysql_connect($server, $db_user, $db_pass) //Подключаемся к БД
  2. mysql_select_db($database) //Выбираем базу данных


а)
PHP:
скопировать код в буфер обмена
  1. $a=mysql_query("select id_comp, name_comp from composers order by name_comp");
  2. while ($b=mysql_fetch_row($a)) {
  3. if ($n<=100) {
  4.           echo "<p>$b[1] - $b[2]</p>\n";
  5.              }
  6.            $n=$n+1;
  7.              }
  8.           echo "Конец списка";
  9.   }


Что-то тут не так, даже не смотря на фигруные скобки. А как подойти ко второй задаче, после выбора базы данных, не пойму.

(Отредактировано автором: 28 Марта, 2011 - 18:21:00)

 
 Top
Мелкий Супермодератор
Отправлено: 28 Марта, 2011 - 18:21:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




mikpankov пишет:
Что-то тут не так.

В чём это проявляется?
По внешнему виду - $n лишняя.

mikpankov пишет:
б) Вывести композиторов из раздела 1
-Рассортировать фамилии по алфавиту

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id_comp, name_comp FROM `имя таблицы связей` LEFT JOIN composers USING (id_comp)  /*или вместо using (id_comp) поставить on `имя поля в таблице связей`=`имя поля id композитора` */ WHERE `id_раздел`=1 ORDER BY name_comp


-----
PostgreSQL DBA
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB