powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / как правильно оформить SELECT
8 сообщений из 8, страница 1 из 1
как правильно оформить SELECT
    #32880933
Vitaly_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Подскажите пожалуйста, как правильно оформить запрос...
Есть база в MySQL, одна из таблиц которой ежедневно полняется информацией о продажах товаров в нескольких торговых точках. Каждый товар имеет уникальный код.
Структура таблицы My_table:
(
MAG_ID Numeric(3), идентификатор магазина
DATA Date, дата продажи
SMENA Numeric(1), номер смены
KOD Char(7), код товара
NAME Char(70), наименование товара
CENA Numeric(8,4), цена
NAL Numeric(4), наличие единиц товара на начало смены
REAL Numeric(4), продано единиц товара за смену
OK Numeric(4), остаток единиц товара на конец смены
...
)

Количество смен в каждом магазине в каждый день произвольное (<=10, но обычно не больше 3-х, 0-первая смена)
Требуется определить остатки товаров на конец определенного дня, т.е. знаем конкретную дату, и остатки надо брать из последей смены каждого магазина.
Допустим, надо вытащить остатки товаров на конец дня в конкретном магазине (MAG_ID=7).
Пробовал так:
SELECT
KOD,
MAX(SMENA) AS LastSmena,
NAME,
CENA,
OK
FROM My_table
WHERE MAG_ID=7 AND DATA="2005/01/24"
GROUP By KOD
ORDER By KOD

В итоге LastSmena равно номеру последней смены в этот день, а вот CENA и OK берутся из смены с минимальным номером (т.е. 0).

Подскажите, пожалуйста, что не так. Заранее благодарю.
...
Рейтинг: 0 / 0
как правильно оформить SELECT
    #32880968
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно в GROUP BY перечисляются все поля, не входящие в групповую функцию (Oracle, например, в противном случае выдает ошибку)
...
Рейтинг: 0 / 0
как правильно оформить SELECT
    #32881036
Vitaly_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tru55Обычно в GROUP BY перечисляются все поля, не входящие в групповую функцию (Oracle, например, в противном случае выдает ошибку)

GROUP BY нужно на случай, если выборка ведется по нескольким магазинам,
тогда одинаковые коды группируются:
SELECT
KOD,
MAX(SMENA) AS LastSmena,
NAME,
CENA,
OK
FROM My_table
WHERE MAG_ID=IN(3,7,80) AND DATA="2005/01/24"
GROUP By KOD
ORDER By KOD
Да и без него этот запрос не работает.

Видимо, надо добавить условие в оператор WHERE, чтобы выбирались только строки с максимальным значением смены, только как это сделать ?
...
Рейтинг: 0 / 0
как правильно оформить SELECT
    #32881790
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если условие неизвестно к началу работы запроса, используют подзапрос

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT kod, name, cena, ok
FROM my_table
WHERE smena = 
  (SELECT MAX(smena)
   FROM my_table
   WHERE data="2005/01/24"
  )
...
Рейтинг: 0 / 0
как правильно оформить SELECT
    #32882446
Vitaly_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tru55Если условие неизвестно к началу работы запроса, используют подзапрос

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT kod, name, cena, ok
FROM my_table
WHERE smena = 
  (SELECT MAX(smena)
   FROM my_table
   WHERE data="2005/01/24"
  )
Не работает - выдает ошибку.

Отдельно подзапрос
Код: plaintext
1.
2.
3.
SELECT MAX(smena)
   FROM my_table
   WHERE data="2005/01/24"
работает, и в моем случае выдает значение 3 .

Но дело в том, что 3 - это номер последней смены в магазинах MAG_ID=31 и MAG_ID=70 за 2005/01/24.
Предположим, что вложенный запрос работает.
Тогда, если надо вытащить остатки в последних сменах в магазинах MAG_ID=3, MAG_ID=7, MAG_ID=80 за 2005/01/24, у которых номера последних смен 2, 2 и 1 соответственно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT kod, name, cena, ok
FROM My_table
WHERE mag_id=IN( 3 , 7 , 80 ) AND data="2005/01/24" AND
  smena = (SELECT MAX(smena)
           FROM my_table
           WHERE data="2005/01/24")
GROUP By KOD
ORDER By KOD
не выдаст ничего, т.к. запрос идет для смен с номерами 3.
А надо, чтобы выдал записи
за смену nr.2 для магазина nr.3,
за смену nr.2 для магазина nr.7,
за смену nr.1 для магазина nr.80 !

Вот.
...
Рейтинг: 0 / 0
как правильно оформить SELECT
    #32882509
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT kod, name, cena, ok
FROM My_table
WHERE (data="2005/01/24") AND 
          (mag_id, smena) IN  (SELECT mag_id, MAX(smena)
                                       FROM my_table
                                       WHERE data="2005/01/24"
                                       GROUP BY mag_id)
GROUP By KOD
ORDER By KOD


Смысл - попарное равенство mag_id и smena результатам подзапроса.

Правда не знаю, работает ли такая конструкция в MySQL (в Oracle - работает)
...
Рейтинг: 0 / 0
как правильно оформить SELECT
    #32882795
Vitaly_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1.9.4.1 Вложенные SELECTы

В сервер MySQL поддерживает вложенные запросы вида INSERT ... SELECT ... и REPLACE ... SELECT .... В других контекстах можно использовать и функцию IN().

Вложенные операции выборки реализованы в версии 4.1.
Это из мануала. У меня v4.0.18. Вложенные запросы не работают.
Попробую поставить v4.1.1alfa, напишу, что получится. Хотя, в том же мануале пишут, что вроде в некоторых случаях вложенный запрос можно реализовать через JOIN .
...
Рейтинг: 0 / 0
как правильно оформить SELECT
    #32883089
Vitaly_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поставил v4.1.1a.
Теперь запрос работает, только на таблице в 2388975 строк он думает 23 минуты. Видимо, с оптимизацией плоховасто. Буду посмотреть, мож. какие индексы добавлю.
Спасибо за помощь !
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / как правильно оформить SELECT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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