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

Тема в разделе "Как сделать...", создана пользователем Sergo_Sev, 22 июл 2014.

  1. Sergo_Sev

    Sergo_Sev Творец

    Регистр.:
    14 июн 2008
    Сообщения:
    571
    Симпатии:
    188
    Есть таблица заказов в БД, от одного клиента по 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

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

    alex2sat Писатель

    Регистр.:
    15 июн 2013
    Сообщения:
    8
    Симпатии:
    17
    Попробуй так

    SELECT name, goods, phone FROM tablename ORDER BY 3
     
  3. Sergo_Sev

    Sergo_Sev Творец

    Регистр.:
    14 июн 2008
    Сообщения:
    571
    Симпатии:
    188
    Нужно, что бы заказы были в том же порядке в каком они поступили (но сгруппированные) т.е. сортировались не по номеру, а по дате или ID, иначе среди сотен заказов нет шансов найти последние
     
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.517
    Симпатии:
    1.365
    Приведи пример группировки, сформировав из данных первого поста как оно должно выглядеть в твоём понимании, сейчас я в твоём описании задачи вижу противоположные друг другу условия
     
  5. Sergo_Sev

    Sergo_Sev Творец

    Регистр.:
    14 июн 2008
    Сообщения:
    571
    Симпатии:
    188
    Добавил более понятный пример вверху
     
  6. BACZ

    BACZ

    Регистр.:
    18 июн 2008
    Сообщения:
    607
    Симпатии:
    379
    Если все это потом надо красиво выводить, то по идее это надо не в запрос всё пихать, а нормально обрабатывать на 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");
    // а здесь накручивать разные художественности для выдачи красивых результатов
    ...
     
    Sergo_Sev нравится это.
  7. Sergo_Sev

    Sergo_Sev Творец

    Регистр.:
    14 июн 2008
    Сообщения:
    571
    Симпатии:
    188
    Не пойму только почему для последнего номера выводится сумма 30, хотя в бд он встречается всего 2 раза - такая проблема именно с последним выводимым номером

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

    Результат
    29-07-2014 11-40-56.png
     
  8. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.517
    Симпатии:
    1.365
    У тебя группировка по прайсу, а надо по phone

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

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

    Только делать такое в цикле с большим количеством селектов как предложил BACZ https://www.nulled.cc/threads/253716/#post-2301718 - это очень плохая практика. После цикла в котором ты выбрал заказы, делай один запрос на дополнительные данные перечислив в where нужные параметры в условии IN('1', '2', ...), если это необходимо!

    Это вредный код - по сути мы делаем выборку "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;
    }
     
    Последнее редактирование: 29 июл 2014
    Sergo_Sev нравится это.
  9. Sergo_Sev

    Sergo_Sev Творец

    Регистр.:
    14 июн 2008
    Сообщения:
    571
    Симпатии:
    188
    т.е. получается так IN('номер_телефона_1', 'номер_телефона_2', ...) ?

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

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.517
    Симпатии:
    1.365
    да, если выборка по телефону

    поправил свой пост, там двумерный массив теперь
     
    Sergo_Sev нравится это.