Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

группирование данных MySQL

393
06 июня 2004 года
Couger
128 / / 13.04.2003
Люди, подскажите плз:

Если у меня есть какая-то инфа в БД и мне надо сгрупировать данные по значению какого-то поля, то я могу просто выбрать все ряды из бд, где поле имеет определенное (известное мне) значение. А как же быть, если есть поля с сколькими неизвестными значениями?

Т.е., например, есть следующая таблица в базе:

id | title | info
1 | заголовок1 | какая-то инфа
2 | заголовок1 | другая инфа
3 | заголовок2 | еще другая
4 | заголовок1 | ....
5 | заголовок2 | ...
8 | заголовок1 | ....
10 | заголовок3 | .........
11 | заголовок4 | ...............

Задача такая: мне нужно вывести, например, под каждым заголовком значения всех полей из всех строк где title - это текущий заголовок (при этом мне неизвестны сами заголовки).
Т.е. должно получится что-то типа:

заголовок1
id: 1; info: какая-то инфа;
id: 2; info: другая инфа;
id: 4; info: ....
id: 8; info: ....

заголовок2
id: 3; info: еще другая;
id: 5; info: ...;

и т.д.
336
08 июня 2004 года
willwin
182 / / 20.09.2000
GROUP BY title
283
09 июня 2004 года
Alone
910 / / 20.11.2002
возможно я могу ошибаться, но то что ты хочешь средствами только mySQL сделать нельзя
я бы делал так:
1. order by title,id
2. в программе получающей результат запроса следил бы за изменением заголовка
393
10 июня 2004 года
Couger
128 / / 13.04.2003
Цитата:
Originally posted by Alone
возможно я могу ошибаться, но то что ты хочешь средствами только mySQL сделать нельзя
я бы делал так:
1. order by title,id
2. в программе получающей результат запроса следил бы за изменением заголовка



Кажется есть идея, как сделать эту задачку средствами только mySQL:

1. Сначало выбираем записи из MySQL и GROUP BY title
В цикле, перебирая результат, присваиваим массиву, например title[], значения, которые уже сгруппированы по названиям, т.е. не повторяются.
2. Берем наш массив, и в новом цикле для каждого значения достаем данные из БД, соответствующие текущему значению из title[] и выполняем уже соответствующие действия.

Как такое решение? Несколько вложенных циклов не сильно замедлят программу?

291
10 июня 2004 года
gufy
703 / / 08.01.2003
так тебе же Alone уже подсказал оптимальное решение. выбираешь записи GROUP BY title SORT BY title.
далее двойной цикл
 
Код:
$result=mysql_query("...");
while ($row=mysql_fetch_array($result)){
   $title=$row["title"];
   while (($row["title"]==$title)&&($row)){
      echo($row["id"]);
      echo($title)
      $row=mysql_fetch_array($result);
   }
}

ну, оформление и пр. сам делай.
283
11 июня 2004 года
Alone
910 / / 20.11.2002
mySQL(покрайней мере в 3-4) выводит данные в ввиде таблици.
То что ты хочеш получить тоже вобщем то таблица но только один из элементов его является тоже таблицей. Так выводить mySQL уже не умеет.
Поэтому либо делай как я тебе сказал либо если у тебя не планируется слишком громадные выборки то собирай ответ в многомерный массив а потом выводи его:
что то вроде
 
Код:
$out[ $row["title"] ][ $row["id"] ]=$row["info"];
393
11 июня 2004 года
Couger
128 / / 13.04.2003
Цитата:
Originally posted by gufy
так тебе же Alone уже подсказал оптимальное решение. выбираешь записи GROUP BY title SORT BY title.
далее двойной цикл
 
Код:
$result=mysql_query("...");
while ($row=mysql_fetch_array($result)){
   $title=$row["title"];
   while (($row["title"]==$title)&&($row)){
      echo($row["id"]);
      echo($title)
      $row=mysql_fetch_array($result);
   }
}

ну, оформление и пр. сам делай.



Как лучше:
while ($row=mysql_fetch_array($result)){...}
или

 
Код:
$result = mysql_query("...");
$number = mysql_num_rows($result);
while ($i < $number){...
$i++; }


Я всегда пользуюсь вторым вариантом, мне он кажется удобнее.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог