Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос на поиск мин. цены, absolute database 
:(
    Опции темы
lat
Дата 17.10.2009, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Есть таблица

Код

DROP TABLE 'Names';
CREATE TABLE 'Names' (
  id AUTOINCINTEGER,
  description VARCHAR(200),
  name1 VARCHAR(200),
  name2 VARCHAR(200),
  name_new VARCHAR(255),
  price FLOAT,
  file_id INTEGER
);


Товар может повторятся в "name_new". Нужно найти товар с минимальной стоимостью.
Вроде ничего сложного, но пока что мне этот запрос не дается. Да ещё и absolute database (ad) как-то долго обрабатывает вложенные запросы.
Первое что пришло в голову это
Код

SELECT n.description as description, n.name1 as name1, n.name2 as name2, n.name_new as name_new, f.name as file, min(n.price) as price                                 
FROM names as n, files as f 
WHERE n.file_id = f.id
GROUP BY n.description, n.name1, n.name2, n.name_new, f.name

Но это не есть гут, так как поле "f.name as file" разное и его сгруппировать нельзя (в принципе как и все остальные, так как повторятся 100% может только "name_new").

Тогда только так: 
Код

SELECT n.name_new as name_new, min(n.price) as price                                 
FROM names as n
GROUP BY n.name_new

В этом случаи все правильно. Кроме того что теперь не понятно как узнать значения всех остальных полей, для найденного мин. значения цены, кроме name_new???
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Gluttton
Дата 17.10.2009, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Не совсем понятно... Описана одна таблица, а в приведенном запросе упоминается две... Что за таблица file?

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

select 
    Names.name_new,
    Sub.price
from Names,
(
    select
        id,
        min(price) as price
    from Names
        group by id
)   as Sub
    where Names.id=Sub.id


Несколько раз перечитывал сообщение, но так до конца не могу понять, что нужно...
Жду ответного сообщения smile , подходит ли предложеное мною решение, и если нет, то что не так?

Если нужно отображать не только name_new, а и name1 или name2, то необходимо внести соответствующие изменения в первую строку...
Код

    Names.name_new, name1, ...


Это сообщение отредактировал(а) Gluttton - 18.10.2009, 15:17


--------------------
Слава Україні!
PM MAIL   Вверх
lat
Дата 17.10.2009, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Цитата(Gluttton @  17.10.2009,  21:44 Найти цитируемый пост)
Не совсем понятно... Описана одна таблица, а в приведенном запросе упоминается две...

Хм, ну вы уже второй кто мне это пишет. Похоже что так и есть ... странно, неужто так коряво объясняю? =) 


Цитата(Gluttton @  17.10.2009,  21:44 Найти цитируемый пост)
 ... и вывести имена с полученым в подзапросе результатом агрегата.


Тот запрос что вы привели поверг меня в ступор ... первый раз такое вижу =) 
Это для какой БД? 
AD на отрез воспротивился ему, и обматерил сам себя таким образом: 
Код

[17.10.2009 21:52:55] Executing Query: 
select  names.name_new,
    Sub.price
from Names,
(
    select
        id,
        min(price) as price
    from names
        group by id
)   as Sub
    where names.id=Sub.id
[17.10.2009 21:52:55] Expression expected, but 'names' found at line 1, column 9 - Native error: 30160

--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Gluttton
Дата 17.10.2009, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Цитата(lat @  17.10.2009,  21:59 Найти цитируемый пост)
Хм, ну вы уже второй кто мне это пишет. Похоже что так и есть ... странно, неужто так коряво объясняю? =) 

Ну, как бы не факт, может это суббота на меня так действует smile, и я что то не так понимаю, но всё таки:
Цитата(lat @  17.10.2009,  21:32 Найти цитируемый пост)
FROM names as n, files as f 

таблицы две...

Цитата(lat @  17.10.2009,  21:59 Найти цитируемый пост)
Тот запрос что вы привели поверг меня в ступор ... первый раз такое вижу =) Это для какой БД? 

Чистый ANSI причем если не ошибаюсь, то даже 92-ой... Запрос обязан пойти на любой СУБД!
Я на сервере запрос, не проверял, поэтому ошибка может быть запросто...
Предлагаю искать её совместными усилиями smile ...

Может names зарезервированное слово и его нужно "обнять" кывычками... Или может быть среда в которой Вы работаете регистрозависима и ей не нравиться, что имена таблиц, то с большой буквы, то с маленькой...


--------------------
Слава Україні!
PM MAIL   Вверх
lat
Дата 17.10.2009, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Попробую еще раз объяснить суть задачи.

Таблица Names
Код

CREATE TABLE 'Names' (
  id AUTOINCINTEGER,
  description VARCHAR(200),
  name1 VARCHAR(200),
  name2 VARCHAR(255),
  name_new VARCHAR(255),
  price FLOAT,
  file_id INTEGER
);


Таблица Files 
Код


CREATE TABLE Files (
  id AUTOINCINTEGER,
  name WIDESTRING(1000),
  date_open DATETIME,
  date_change DATETIME
);


Таблицы связанны между собой по ключу Files.id --->> Names.file_id
Пример данных:

Код

...
INSERT INTO 'Names' (id, description, name1, name2, name_new, price, file_id) values (50676, 'Цифровые фотоаппараты', 'CANON', 'CANON IXUS 110 IS Gold', 'canonixus110isgold', 375, 27);
INSERT INTO 'Names' (id, description, name1, name2, name_new, price, file_id) values (50677, 'Цифровые фотоаппараты', 'CANON', 'CANON IXUS 110 IS Gold', 'canonixus110isgold', 370, 28);
...


Задача: "Найти все данные по товару, который имеет наименьшую стоимость?"




Это сообщение отредактировал(а) lat - 17.10.2009, 22:32
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Gluttton
Дата 17.10.2009, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Вот тут у топикстартера сервер возвращал такую же ошибку... Может поможет...

Добавлено через 3 минуты и 10 секунд
Цитата(lat @  17.10.2009,  22:06 Найти цитируемый пост)
Пример данных:КодincludeSyntax('sql');
...INSERT INTO 'Names' (id, description, name1, name2, name_new, price, file_id) values (50676, 'Цифровые фотоаппараты', 'CANON', 'CANON IXUS 110 IS Gold', 'canonixus110isgold', 375, 27);
INSERT INTO 'Names' (id, description, name1, name2, name_new, price, file_id) values (50676, 'Цифровые фотоаппараты', 'CANON', 'CANON IXUS 110 IS Gold', 'canonixus110isgold', 370, 28);...highlightSyntax('sql_ZTQxMm','sql');Задача: "Найти все данные по товару, который имеет наименьшую стоимость?"

Вставляются одинаковый ID, опечатка? Или так и должно быть по логике БД?



--------------------
Слава Україні!
PM MAIL   Вверх
lat
Дата 17.10.2009, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Цитата(Gluttton @  17.10.2009,  22:05 Найти цитируемый пост)
Может names зарезервированное слово и его нужно "обнять" кывычками... Или может быть среда в которой Вы работаете регистрозависима и ей не нравиться, что имена таблиц, то с большой буквы, то с маленькой... 

Цитата(Gluttton @  17.10.2009,  22:09 Найти цитируемый пост)
Вот тут у топикстартера сервер возвращал такую же ошибку... Может поможет... 


Ошибка изменилась =)
Поменял название таблицы "Names" на "Tovar"
Теперь так:

Код

[17.10.2009 22:11:00] Executing Query: 
select  Tovar.name_new, Sub.price from Tovar, (
    select
        id,
        min(price) as price
    from Tovar
        group by id
)   as Sub
    where Tovar.id=Sub.id
[17.10.2009 22:11:00] Ambiguous field reference to 'id' - Native error: 10404



--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Gluttton
Дата 17.10.2009, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Цитата(lat @  17.10.2009,  22:12 Найти цитируемый пост)
[17.10.2009 22:11:00] Ambiguous field reference to 'id' - Native error: 10404

Говорит, что нет такой колонки как id ...

Цитата(lat @  17.10.2009,  22:06 )
Цитата

Пример данных:КодincludeSyntax('sql');
...INSERT INTO 'Names' (id, description, name1, name2, name_new, price, file_id) values (50676, 'Цифровые фотоаппараты', 'CANON', 'CANON IXUS 110 IS Gold', 'canonixus110isgold', 375, 27);
INSERT INTO 'Names' (id, description, name1, name2, name_new, price, file_id) values (50676, 'Цифровые фотоаппараты', 'CANON', 'CANON IXUS 110 IS Gold', 'canonixus110isgold', 370, 28);...highlightSyntax('sql_ZTQxMm','sql');Задача: "Найти все данные по товару, который имеет наименьшую стоимость?"


Вставляются одинаковый ID, опечатка? Или так и должно быть по логике БД?

Это сообщение отредактировал(а) Gluttton - 17.10.2009, 22:15


--------------------
Слава Україні!
PM MAIL   Вверх
lat
Дата 17.10.2009, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Цитата(Gluttton @  17.10.2009,  22:14 Найти цитируемый пост)
Говорит, что нет такой колонки как id ...


хм ... с чего бы это.

Цитата(Gluttton @  17.10.2009,  22:14 Найти цитируемый пост)
Вставляются одинаковый ID, опечатка? Или так и должно быть по логике БД?

ой, сорри)))
Это Я копипастил))) Ид разные ... ща исправлю ...


--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Gluttton
Дата 17.10.2009, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Цитата(lat @  17.10.2009,  22:06 Найти цитируемый пост)
Таблицы связанны между собой по ключу Names.file_id <---> Files.id

На скольк я понимаю, то таблицы связаны многие к одному... А раз так, то многим записям из таблицы Names будет соответствовать одна запись таблицы Files...
А раз так, то...

1. Находим минимальное значение цены и первичный ключ товара:
Код

select
    id,
    min(price) as price
from Tovar
    group by id


2. Нам необходимо вывести всю информацию, поэтому выполняем само-соединение...
Код

select
    Sub.id,
    Tovar.description,
    Tovar.name1,
    Tovar.name2
    Tovar.name_new,
    Sub.price,
    Tovar.file_id
from Tovar,
(
    select
        id,
        min(price) as price
    from Tovar
        group by id
)   as Sub
    where Tovar.id=Sub.id


3. Добавляем информацию из таблицы Files...
Код

select
    Sub.id,
    Tovar.description,
    Tovar.name1,
    Tovar.name2
    Tovar.name_new,
    Sub.price,
    Files.name
from Tovar, Files,
(
    select
        id,
        min(price) as price
    from Tovar
        group by id
)   as Sub
    where Tovar.id=Sub.id
    and Tovar.id=Files.id


Прошу написать начиная с какого этапа будет ошибка?
Я вот тут подумал, а подзапросы той штуковиной в которой Вы выполняете запросы поддерживаються?


Это сообщение отредактировал(а) Gluttton - 18.10.2009, 15:16


--------------------
Слава Україні!
PM MAIL   Вверх
lat
Дата 17.10.2009, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Цитата(Gluttton @  17.10.2009,  22:26 Найти цитируемый пост)
На скольк я понимаю, то таблицы связаны многие к одному... А раз так, то многим записям из таблицы Names будет соответствовать одна запись таблицы Files...
А раз так, то...


Да, именно так. (стрелочки уже исправил) =)

Код


[17.10.2009 22:29:49] Executing Query: 
select
    id,
    min(price) as price
from Tovar
    group by id
[17.10.2009 22:29:50] Ok.
[17.10.2009 22:29:50]  Execution time: 00:00:00.204


Тупо выдало все поля.

Код


[17.10.2009 22:33:55] Executing Query: 
select
    Sub.id,
    Tovar.description,
    Tovar.name1,
    Tovar.name2
    Tovar.name_new,
    Sub.price,
    Tovar.file_id
from Tovar,
(
    select
        id,
        min(price) as price
    from Tovar
        group by id
)   as Sub
    where Tovar.id=Sub.id
[17.10.2009 22:33:55] Token 'FROM' expected, but '.' found at line 6, column 10 - Native error: 30184



Код

[17.10.2009 22:35:30] Executing Query: 
select
    Sub.id,
    Tovar.description,
    Tovar.name1,
    Tovar.name2
    Tovar.name_new,
    Sub.price,
    Files.name
from Tovar, Files,
(
    select
        id,
        min(price) as price
    from Tovar
        group by id
)   as Sub
    where Tovar.id=Sub.id
    and Tovar.id=Files.id
[17.10.2009 22:35:30] Token 'FROM' expected, but '.' found at line 6, column 10 - Native error: 30184




Цитата(Gluttton @  17.10.2009,  22:26 Найти цитируемый пост)
Прошу написать начиная с какого этапа будет ошибка?
Я вот тут подумал, а подзапросы той штуковиной в которой Вы выполняете запросы поддерживаються? 


Отработал без ошибок только первый запрос. 

AD подзапросы вроде умеет хавать, но не знаю правильно ли он их пережёвывает.

--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Gluttton
Дата 17.10.2009, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



До меня только сейчас начало доходить smile ...
Что за бред я пишу...
Ищу минимальное значение с группировкой по ключу smile ...
Запрос вернет мне все данные...

Дубль два...

Код

select
    Tovar.id,
    Tovar.description,
    Tovar.name1,
    Tovar.name2
    Tovar.name_new,
    Sub.price,
    Files.name
from Tovar, Files,
( 
    select
        file_id,
        min(price) as price
)   as Sub
    where Tovar.price=Sub.price
    and Tovar.file_id=Sub.file_id
    and File.id=Sub.file_id


Надеюсь теперь то что нужно smile ...


--------------------
Слава Україні!
PM MAIL   Вверх
lat
Дата 17.10.2009, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Код

[17.10.2009 22:46:51] Executing Query: 
select
    Tovar.id,
    Tovar.description,
    Tovar.name1,
    Tovar.name2
    Tovar.name_new,
    Sub.price,
    Files.name
from Tovar, Files,
( 
    select
        file_id,
        min(price) as price
)   as Sub
    where Tovar.price=Sub.price
    and Tovar.file_id=Sub.file_id
    and File.id=Sub.file_id
[17.10.2009 22:46:51] Token 'FROM' expected, but '.' found at line 6, column 10 - Native error: 30184


хм ... либо AD не умеет такое хавать, либо запрос не совсем рабочий)

--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Gluttton
Дата 17.10.2009, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



А там в комплекте поставки Help'а никакого нету? Если есть то прошу прицепить к сообщению, что бы можно было по кодам ошибок почитать...

Добавлено через 3 минуты и 7 секунд
Предлагаю провести эксперимент...
Выполнить два запроса:

1.
Код

select * from Tovar


2.
Код

select * from Tovar,
(
    select * from Tovar
)   as Sub
    where Tovar.id=Sub.id


Я думаю первый запрос пройдет, а вот интересно, что со вторым будет...

Добавлено через 7 минут и 15 секунд
Второй запрос проверил на Firebird 2.1 на предмет досадных синтаксических ошибок - работает...
Т.е. склонен думать, что если второй запрос не пройдет на AD'e (или в AD'у smile не знаю как правильно), то оно не поддерживает вложеные подзапросы...


--------------------
Слава Україні!
PM MAIL   Вверх
lat
Дата 17.10.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Цитата(Gluttton @  17.10.2009,  22:48 Найти цитируемый пост)
А там в комплекте поставки Help'а никакого нету? Если есть то прошу прицепить к сообщению, что бы можно было по кодам ошибок почитать...


Вот немного о БД


Код

[17.10.2009 22:54:35] Executing Query: 
select * from Tovar
[17.10.2009 22:54:35] Ok.


Код

[17.10.2009 22:55:06] Executing Query: 
select * from Tovar,
(
    select * from Tovar
)   as Sub
    where Tovar.id=Sub.id
[17.10.2009 22:55:06] Ambiguous field reference to 'id' - Native error: 10404


Вот откуда ноги росли ... походу AD тупит)
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0574 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.