Награда результаты.Помогите? - PullRequest
0 голосов
/ 20 ноября 2011

Я пытаюсь создать SQL-запрос безуспешно.Поскольку я новичок, я надеюсь найти вашу помощь.

Пейзаж: магазин организует награду среди своих клиентов.Вот база данных, которая у них есть:

__________________________________________________________________
id  |    name     |   date     |   time   |   item   |  section  |
__________________________________________________________________

01  |  J. Smith   | 2011-10-30 | 10:12:56 |  shoes   |   sport   |
02  |  J. Smith   | 2011-10-27 | 11:14:19 |  T-shirt |   sport   |
03  |  M. Douglas | 2011-11-01 | 04:00:42 | keyboard | computer  |
04  |  R. Obrian  | 2010-12-31 | 11:33:57 |  webcam  | computer  |
05  |  M. Douglas | 2011-01-07 | 12:42:00 |  webcam  | computer  |
06  |  J. Smith   | 2011-02-05 | 02:30:51 |  T-shirt |   sport   |
07  |  J. Smith   | 2011-05-12 | 06:55:14 |  bike    |   sport   |
08  |  J. Smith   | 2011-03-15 | 09:59:22 |  shoes   |   sport   |
09  |  J. Smith   | 2011-09-09 | 08:10:36 |  webcam  | computer  |
10  |  J. Smith   | 2011-06-09 | 10:00:38 |microphone| computer  |

Я хочу составить список 10 лучших клиентов для каждого раздела по следующим критериям: лучший покупатель - это тот, кто купил наибольшее количество РАЗНЫХ предметов.В случае одинаковых результатов (одинаковое количество различных купленных товаров) среди покупателей, лучшим покупателем является тот, кто 1-й (дата и время) купил все свои товары.

Я бы хотел, например, следующеетаблица 10 лучших результатов:

                          SPORT
 ____________________________________________________________ 
 |  name   |   items bought (different)  |     Date & Time   |
 ____________________________________________________________ 
 | XXXYYY  |             16              | 2011-10-05  @07:15| 
 | ZZZZTT  |             16              | 2011-10-05  @08:10| 
 | QQHAIJ  |             16              | 2011-10-06  @10:35| 
 | TTTSFT  |             15              | 2011-11-03  @12:22|
 | LIUREN  |             14              | 2011-11-14  @16:10|
 | ODIRNU  |             9               | 2011-07-03  @14:18|
 | OIXUED  |             8               | 2011-11-20  @03:03|
 | SUHDKO  |             7               | 2011-02-02  @22:51|
 | TNODJH  |             7               | 2011-06-10  @12:55|
 | ENOSJR  |             6               | 2011-04-04  @11:39|
 _____________________________________________________________

Запросы должны быть разными для каждого раздела, то есть я должен иметь различную строку (и таблицу результатов) для SPORT, COMPUTER ... и т. д.

Кто может мне помочь?Заранее спасибо!

Боб.

Ответы [ 3 ]

1 голос
/ 20 ноября 2011

Это работает?

SELECT 
    t1.name, 
    COUNT(*) as `Distinct items bought`, 
    MIN(t1.computedDateTime) as `Date And Time` 
FROM
    (
    SELECT 
        name,  MIN(ADDTIME(date, time)) as computedDateTime, item
    FROM 
        tablename
    WHERE
        Section = "sport"
    GROUP BY
        name, item
    ) t1
GROUP BY
    name
ORDER BY 
    count(*), MIN(computedDateTime)  DESC
LIMIT 10

Внутренний выбор (должен) производить таблицу отдельных предметов, купленных отдельными лицами, ограниченную секцией "sport". Затем внешний выбор определяет общее количество этих отдельных покупок по имени и сортирует их.

Я не настроен проверять это прямо сейчас, так что будьте осторожны. Больше всего меня беспокоит функция ADDTIME для объединения даты и времени, которой я раньше не пользовался.

1 голос
/ 20 ноября 2011

Ранний покупатель первого предмета выигрывает

SELECT name,
    COUNT(DISTINCT item) AS items, 
    MIN(ADDTIME(`date`,`time`)) AS `datetime`
FROM purchase
WHERE section = 'computer'
GROUP BY name
ORDER BY items DESC, `datetime` ASC
LIMIT 0,10

Пример таблицы результатов:

|- name       -|- items -|- datetime            -|
|- M. Douglas -|- 2     -|- 2011-01-07 12:42:00 -|
|- J. Smith   -|- 2     -|- 2011-06-09 10:00:38 -|
|- R. Obrian  -|- 1     -|- 2010-12-31 11:33:57 -|

Ранний покупатель последнего предмета выигрывает

SELECT name,
    COUNT(DISTINCT item) AS items, 
    MAX(ADDTIME(`date`,`time`)) AS `datetime`
FROM purchase
WHERE section = 'computer'
GROUP BY name
ORDER BY items DESC, `datetime` ASC
LIMIT 0,10

Пример таблицы результатов:

|- name       -|- items -|- datetime            -|
|- J. Smith   -|- 2     -|- 2011-09-09 08:10:36 -|
|- M. Douglas -|- 2     -|- 2011-11-01 04:00:42 -|
|- R. Obrian  -|- 1     -|- 2010-12-31 11:33:57 -|
0 голосов
/ 20 ноября 2011

Попробуйте это:

SELECT name, date, time, COUNT(DISTINCT item) AS NumOfItems
FROM Purchased
WHERE section = 'sport'
ORDER BY NumOfItems, date, time
LIMIT 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...