Группировка с выводом всех результатов

Sergo_Sev

Творец
Регистрация
14 Июн 2008
Сообщения
578
Реакции
193
Есть таблица заказов в БД, от одного клиента по 2-3 заказа

Петя | Товар 1 | Телефон 111
Маша | Товар 3 | Телефон 222
Петя | Товар 2 | Телефон 111
Вася | Товар 2 | Телефон 000
Петя | Товар 3 | Телефон 111

Или

Маша | Товар 3 | Телефон 222 (Дальше идёт следующий клиент и т.д.)
Вася | Товар 2 | Телефон 000 (Предпоследний заказ оставил Вася - он идёт следующим по списку)
Петя | Товар 1 | Телефон 111
Петя | Товар 2 | Телефон 111 (Группируем остальные заказы Пети к его последнему заказу)
Петя | Товар 3 | Телефон 111 (Петя оставил самый последний заказ, его и выводим в первую очередь)

group by по номеру телефона позволяет вывести только 1 строку вместо всех
Маша | Товар 3 | Телефон 222
Вася | Товар 2 | Телефон 000
Петя | Товар 3 | Телефон 111

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

SELECT name, goods, phone FROM tablename ORDER BY 3
 
Попробуй так
SELECT name, goods, phone FROM tablename ORDER BY 3
Нужно, что бы заказы были в том же порядке в каком они поступили (но сгруппированные) т.е. сортировались не по номеру, а по дате или ID, иначе среди сотен заказов нет шансов найти последние
 
Нужно, что бы заказы были в том же порядке в каком они поступили (но сгруппированные) т.е. сортировались не по номеру, а по дате или ID, иначе среди сотен заказов нет шансов найти последние

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

$res=$db->getData("SELECT distinct phone FROM orders_all ORDER BY order_date"); // или не phone а какой то user_id
foreach ($res as $user_item) {
$user_orders=$db->getData("SELECT * FROM orders_all where phone='".mysql_real_escape_string($user_item['phone'])."' ORDER BY order_date");
// а здесь накручивать разные художественности для выдачи красивых результатов
...
 
Не пойму только почему для последнего номера выводится сумма 30, хотя в бд он встречается всего 2 раза - такая проблема именно с последним выводимым номером

Запрос
SELECT count(*),phone FROM `zakaz` GROUP BY price ORDER BY price DESC

Результат
29-07-2014 11-40-56.png
 
SELECT count(*), phone FROM `zakaz` GROUP BY price ORDER BY price DESC

У тебя группировка по прайсу, а надо по phone

По первому твоему запросу, полагаю что использовать группировку тут не верно, скорее стоит использовать разбиение на несколько запросов или order по нескольким полям.

проще всего последние - SELECT * FROM orders_all ORDER BY phone, order_date

Только делать такое в цикле с большим количеством селектов как предложил BACZ Для просмотра ссылки Войди или Зарегистрируйся - это очень плохая практика. После цикла в котором ты выбрал заказы, делай один запрос на дополнительные данные перечислив в where нужные параметры в условии IN('1', '2', ...), если это необходимо!

$res=$db->getData("SELECT distinct phone FROM orders_all ORDER BY order_date"); // или не phone а какой то user_id
foreach ($res as $user_item) {
$user_orders=$db->getData("SELECT * FROM orders_all where phone='".mysql_real_escape_string($user_item['phone'])."' ORDER BY order_date");
// а здесь накручивать разные художественности для выдачи красивых результатов
...
Это вредный код - по сути мы делаем выборку "SELECT * FROM orders_all ORDER BY order_date", но только не одним запросом, а таким количеством запросов, сколько у нас в базе телефонных номеров. Но зачем это делать, если можно отсортировать на php?
PHP:
foreach ($res as $row) { //предпологается, что $res содержит массив со всеми результатами, но здесь может и классический while и mysql_fetch_assoc / mysqli_fetch_assoc 
$result[$row['phone']][] = $row;
}
 
Последнее редактирование:
После цикла в котором ты выбрал заказы, делай один запрос на дополнительные данные перечислив в where нужные параметры в условии IN('1', '2', ...)
т.е. получается так IN('номер_телефона_1', 'номер_телефона_2', ...) ?

В примере на php получается
$result[телефон_1] = остальные_данные_из_строки_с_этим_номером;
Но далее если снова встретится этот номер в другой строке, то данные перезапишутся, значит нужно по другому это делать
 
т.е. получается так IN('номер_телефона_1', 'номер_телефона_2', ...) ?
да, если выборка по телефону

В примере на php получается
$result[телефон_1] = остальные_данные_из_строки_с_этим_номером;
Но далее если снова встретится этот номер в другой строке, то данные перезапишутся, значит нужно по другому это делать
поправил свой пост, там двумерный массив теперь
 
Назад
Сверху