Консультация № 171225
11.08.2009, 07:39
0.00 руб.
07.11.2009, 14:33
0 5 3
Здравствуйте
есть 4 таблицы- категории товаров,виды товаров,покупки и пользователи. Структура таблиц в приложении
Нужно выбрать пользователя, который закупил больше всего,например, жестких дисков.
Т.е. в 1м запросе сделать обращение к 4м таблицам

Пока что получилось выбрать id пользователей и число закупленных ими товаров(код в приложении)
последний шаг-выбор имени пользователя который закупил больше всего жестких дисков никак не получается(

Приложение:
catalogs
id_catalog name
1 Процессоры
4 Жесткие диски
...

products
id_product name count id_catalog
1 Celeron 1.8 10 1
2 Celeron 2.0 2 1
...

orders
id_order id_user number id_product
1 3 1 8
2 6 2 10
...

users
id_user surname patronymic name
1 Иванов Валерьевич Александр
2 Лосев Иванович Сергей
...

SELECT
orders.id_user AS id_usr,
SUM(orders.number) AS num
FROM
orders
WHERE
orders.id_product IN (SELECT products.id_product FROM products WHERE products.id_catalog = (SELECT catalogs.id_catalog FROM catalogs WHERE catalogs.name = 'Жёсткие диски'))
GROUP BY
orders.id_user

Обсуждение

Неизвестный
11.08.2009, 09:44
общий
это ответ
Здравствуйте, Sov.

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

Приложение:
select
q2.numbers,
users.surname,
users.patronymic,
users.name
from
(
select
row_number() over (order by numbers desc) as rn,
q1.numbers,
q1.id_user
from
(
select
SUM(orders.numbers) as numbers,
orders.id_user
from
catalogs,
products,
orders
where
catalogs.name = 'Жесткие диски'
and orders.id_product = products.id_product
and products.id_catalog = catalogs.id_catalog
group by id_user
) q1
) q2,
users
where
q2.rn = 1
and q2.id_user = users.id_user
5
Спасибо)
Неизвестный
11.08.2009, 10:17
общий
отсортируйте и выберите первый:

SELECT limit 1
orders.id_user AS id_usr,
SUM(orders.number) AS num
FROM
orders
WHERE
orders.id_product IN (SELECT products.id_product FROM products WHERE products.id_catalog = (SELECT catalogs.id_catalog FROM catalogs WHERE catalogs.name = 'Жёсткие диски'))
GROUP BY
orders.id_user
order by 2 desc

Правда вариант, когда у нескольких человек количество совпадает здесь тоже не учтен. Если его нужно учитывать, то либо через создание просмотров, либо через подзапросы a-la предложеный Digitall'ом, но сложнее
Неизвестный
11.08.2009, 10:45
общий
это ответ
Здравствуйте, Sov.

Для MySQL вот такой запрос


Приложение:

SELECT
u.id_user
, u.surname
, u.patronymic
, u.name
, SUM(o.number)
, c.name
FROM
users u
INNER JOIN orders o
ON (u.id_user = o.id_user)
INNER JOIN products p
ON (o.id_product = p.id_product)
INNER JOIN catalogs c
ON (p.id_catalogue = c.id_catalogue and c.id_catalogue=2)
group by u.id_user
ORDER by SUM(o.number) DESC
LIMIT 1
5
Спасибо большое!)
Неизвестный
11.08.2009, 10:48
общий
Добавление
У меня каталог жостких дисков был с ИД 2 потому
INNER JOIN catalogs c
ON (p.id_catalogue = c.id_catalogue and c.id_catalogue=2)
для вас нужно поправить
INNER JOIN catalogs c
ON (p.id_catalogue = c.id_catalogue and c.id_catalogue=4)
давно
Академик
320937
2216
12.08.2009, 16:00
общий
это ответ
Здравствуйте, Sov.
Ответ в приложении. Проверен на FireBird 2.0, хотя системно-зависимым является только LEFT OUTER JOIN, то есть должно идти и на других СУБД.
Три разных способа извлечения: ALL, EXISTS, IN применил умішленно, можно было бьі обойтись только использованием EXISTS / NOT EXISTS

Приложение:
select o.id_user, u.surname, u.name, u.patronymic
from orders o
left outer join users u on o.id_user = u.id_user
where o.id_product in
(
select p.id_product from products p
where p.id_catalog =
(
select c.id_catalog from catalogs c
where c.name = 'Жёсткие диски'
)
)
group by o.id_user, u.surname, u.name, u.patronymic
having sum(o.number)>=all
(
select sum(o.number)
from orders o
where o.id_product in
(
select p.id_product from products p
where p.id_catalog =
(
select c.id_catalog from catalogs c
where c.name = 'Жёсткие диски'
)
)
group by o.id_user
)

5
Спасибо,проверено в mysql,работает)
Форма ответа