ВЫБЕРИТЕ самую новую запись любой ГРУППЫ записей (игнорируя записи с одной записью) - PullRequest
0 голосов
/ 02 июня 2011

Возникли проблемы с запросом на возврат самого нового заказа из любого сгруппированного набора заказов, имеющих более 1 заказа. CREATE & INSERT для тестовых данных ниже.

Этот запрос возвращает уникальный идентификатор клиента, с которым я хочу работать, а также сгруппированные идентификаторы заказа. Из этих записей мне нужен только самый последний порядок (на основе date_added).

ВЫБЕРИТЕ COUNT (customer_id), customer_id, GROUP_CONCAT (order_id) FROM orderTable GROUP BY customer_id HAVING COUNT (customer_id)> 1 ПРЕДЕЛ 10;

mysql> SELECT COUNT(customer_id), customer_id, GROUP_CONCAT(order_id) FROM orderTable     GROUP BY customer_id HAVING COUNT(customer_id)>1 LIMIT 10;
+--------------------+-------------+------------------------+
| COUNT(customer_id) | customer_id | GROUP_CONCAT(order_id) |
+--------------------+-------------+------------------------+
|                  2 | 0487        | F9,Z33                 |
|                  3 | 1234        | 3A,5A,88B              |
+--------------------+-------------+------------------------+
2 rows in set (0.00 sec)

Я ищу заказы Z33 (customer_id 0487) и 3A (customer_id 1234).

Для пояснения, я не хочу заказы для клиентов, которые заказали только один раз.

Любая помощь или советы, чтобы направить меня в правильном направлении.

Пример таблицы данных:

-

- Структура таблицы для таблицы orderTable

СОЗДАТЬ СТОЛ, ЕСЛИ НЕ СУЩЕСТВУЕТ orderTable ( customer_id varchar (10) NOT NULL, order_id varchar (4) NOT NULL, date_added дата не равна NULL, ПЕРВИЧНЫЙ КЛЮЧ (customer_id, order_id) ) ENGINE = MySAM CHARSET ПО УМОЛЧАНИЮ = latin1;

-

- Сброс данных для таблицы orderTable

INSERT INTO orderTable (customer_id, order_id, date_added) ЗНАЧЕНИЯ («1234», «5А», «1997-01-22»), («1234», «88B», «1992-05-09»), («0487», «F9», «2002-01-23»), («5799», «A12F», «2007-01-23»), («1234», «3А», «2009-01-22»), («3333», «7FHS», «2009-01-22»), («0487», «Z33», «2004-06-23»);

=============================================== ===========

1 Ответ

1 голос
/ 02 июня 2011

Уточнение запроса. Вопрос состоял в том, чтобы включить только тех клиентов, у которых было больше ... следовательно, мой запрос содержит INSIDE с GROUP BY ... Таким образом, он ТОЛЬКО ДАЕТ соответствующему клиенту, что У него было несколько заказов, но в то же время дает только самая последняя дата последнего заказа для человека ... Затем PreQuery повторно присоединяется к таблице заказов по общему идентификатору клиента, но только для заказа, который соответствует последней дате, обнаруженной в предварительном запросе. Если бы у клиента был только один заказ, его внутренний счетчик PreQuery был бы только 1 и, следовательно, исключался из окончательного набора результатов PreQuery.

select ot.*
   from
      ( select
            customer_id,
            max( date_added ) as LastOrderDate,
         from
            orderTable
         having 
            count(*) > 1
         group by
            customer_id ) PreQuery
     join orderTable ot
        on PreQuery.Customer_ID = ot.Customer_ID
       and PreQuery.LastOrderDate = ot.date_added
...