powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите составить сложный запрос, пожалуйста
2 сообщений из 2, страница 1 из 1
Помогите составить сложный запрос, пожалуйста
    #38451915
SARD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Прошу помощи.
Дано: таблица с товарами Goods, таблица с каталогом Catalog и таблица соответствий товаров разделу каталога gDep.
Например, раздел каталога "Тетрадки" имеет id = 3.
А товар "Тетрадка с Человеком-пауком" (его id = 1) относится и к разделу "Тетрадки", и к разделу "Человек-паук" (у которого id = 5).
По этому поводу в таблице gDep есть такие записи:
gId = 1 gSub = 3
gId = 1 gSub = 5

Соответственно, когда мы попадаем в раздел каталога "Тетрадки", то мы выводим товар таким запросом:
SELECT * FROM gDep LEFT JOIN Goods ON gDep.gId = Goods.Id WHERE gDep.gSub = '3'

Вроде все просто и понятно.

Но есть задача все это добро усложнить. И сделать сортировку результатов по наличию товара.
То есть, чем больше товара сейчас в наличии, тем выше его позиция в выдаче.
Для этого нужно узнать, сколько единиц товара было получено, сколько единиц продано, посчитать разницу и сделать сортировку по этой разнице в обратном порядке.

Копаем дальше. Есть таблица Orders. В ней есть поле oSupplier, которое если имеет значение 0 - то это продажа товара, а если не 0 - то это приход товара. А еще есть поле State, которое если больше 2 - то этот заказ полностью обработан.
И есть таблица OrdersContent, в которой указаны конкретные id товара, ну и естественно ссылка на таблицу Orders, т.е. к какому именно заказу относится приход/расход этого товара.
Муть немного, да? Постараюсь раскидать код, как подчет ведется сейчас.

SELECT CAST(SUM(IF(Orders.oSupplier <> 0 AND Orders.State > 2, OrdersContent.Col, 0)) as UNSIGNED) AS TotalShip, _
CAST(SUM(IF(Orders.oSupplier = 0 AND Orders.State > 0, OrdersContent.Col, 0)) as UNSIGNED) AS TotalSold _
FROM OrdersContent _
LEFT JOIN Orders _
ON OrdersContent.OrderId = Orders.oId _
WHERE OrdersContent.Good = '1'

Выполнив на странице товара этот запрос, мы получам общее количество полученного товара TotalShip и обще количество проданного товара TotalSold.
Вот в принципе, нужно как-то первый запрос вывода товара в каталоге (с одним LEFT JOIN) объединить со вторым запросом подсчета количества полученного/проданного товара (с другим LEFT JOIN), да еще и так, чтобы в первом запросе можно было приписать "ORDER BY TotalShip-TotalSold DESC".

Я что-то никак не могу им мозгов дать... Слишком монстроузная конструкция для моего понимания получается )
...
Рейтинг: 0 / 0
Помогите составить сложный запрос, пожалуйста
    #38452238
transpose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT *,TotalShip-TotalSold as count_avalable -- здесь еще добавить логику по обработке NULL
FROM gDep 
LEFT JOIN Goods ON gDep.gId = Goods.Id 
LEFT JOIN
(
SELECT OrdersContent.Good,
CAST(SUM(IF(Orders.oSupplier <> 0 AND Orders.State > 2, OrdersContent.Col, 0)) as UNSIGNED) AS TotalShip, _
CAST(SUM(IF(Orders.oSupplier = 0 AND Orders.State > 0, OrdersContent.Col, 0)) as UNSIGNED) AS TotalSold _
FROM OrdersContent _
LEFT JOIN Orders _
ON OrdersContent.OrderId = Orders.oId _
group by OrdersContent.Good
) availability on availability.Good = Goods.Id 
WHERE gDep.gSub = '3'
ORDER BY count_avalable DESC
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите составить сложный запрос, пожалуйста
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]