группирование данных MySQL
Если у меня есть какая-то инфа в БД и мне надо сгрупировать данные по значению какого-то поля, то я могу просто выбрать все ряды из бд, где поле имеет определенное (известное мне) значение. А как же быть, если есть поля с сколькими неизвестными значениями?
Т.е., например, есть следующая таблица в базе:
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: ...;
и т.д.
GROUP BY title
я бы делал так:
1. order by title,id
2. в программе получающей результат запроса следил бы за изменением заголовка
Цитата:
Originally posted by Alone
возможно я могу ошибаться, но то что ты хочешь средствами только mySQL сделать нельзя
я бы делал так:
1. order by title,id
2. в программе получающей результат запроса следил бы за изменением заголовка
возможно я могу ошибаться, но то что ты хочешь средствами только mySQL сделать нельзя
я бы делал так:
1. order by title,id
2. в программе получающей результат запроса следил бы за изменением заголовка
Кажется есть идея, как сделать эту задачку средствами только mySQL:
1. Сначало выбираем записи из MySQL и GROUP BY title
В цикле, перебирая результат, присваиваим массиву, например title[], значения, которые уже сгруппированы по названиям, т.е. не повторяются.
2. Берем наш массив, и в новом цикле для каждого значения достаем данные из БД, соответствующие текущему значению из 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)){
$title=$row["title"];
while (($row["title"]==$title)&&($row)){
echo($row["id"]);
echo($title)
$row=mysql_fetch_array($result);
}
}
ну, оформление и пр. сам делай.
То что ты хочеш получить тоже вобщем то таблица но только один из элементов его является тоже таблицей. Так выводить mySQL уже не умеет.
Поэтому либо делай как я тебе сказал либо если у тебя не планируется слишком громадные выборки то собирай ответ в многомерный массив а потом выводи его:
что то вроде
Код:
$out[ $row["title"] ][ $row["id"] ]=$row["info"];
Цитата:
Originally posted by gufy
так тебе же Alone уже подсказал оптимальное решение. выбираешь записи GROUP BY title SORT BY title.
далее двойной цикл
ну, оформление и пр. сам делай.
так тебе же 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)){
$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++; }
$number = mysql_num_rows($result);
while ($i < $number){...
$i++; }
Я всегда пользуюсь вторым вариантом, мне он кажется удобнее.