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

Поиск:

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


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


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

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



Так... У меня работает на Firebird 2.1...
Код

select
    "NAMES".name_new,
    "NAMES".price as MinPrice,
    Files.name
from "NAMES", Files
    where "NAMES".file_id=Files.id
    and "NAMES".price=
    (
        select min(SN.price)
        from "NAMES" AS SN
           where "NAMES".name_new=SN.name_new
    )

Вот что возвращает:
user posted image

Добавлено через 1 минуту и 17 секунд
Цитата(lat @  18.10.2009,  00:45 Найти цитируемый пост)
Та да. Задачка повергла уже как минимум 3 - х людей в некий продолжительно-мучительный ступор =)Видно это все влияние госпожи субботы ;)

Не хочу отвлекаться, т.к. уже устал, но я бы с удовольствием покритиковал (конструктивно) структуру, уже ставшей мне родной smile , БД!

Добавлено через 4 минуты и 45 секунд
Или же вот такой результат:
user posted image
Для вот такого запроса:
Код

select
    "NAMES".name_new,
    "NAMES".id,
    "NAMES".description,
    "NAMES".name1,
    "NAMES".name2,
    "NAMES".price as MinPrice,
    FILES.name
from "NAMES", FILES
    where "NAMES".file_id=FILES.id
    and "NAMES".price=
    (
        select min(SN.price)
        from "NAMES" AS SN
           where "NAMES".name_new=SN.name_new
    )



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


Шустрый
*


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

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



эх ... у меня на AD возвращает почему - то 1 результат (((
видно придется думать о смене СУБД, другого выхода увы не вижу.

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  re.jpg 52,68 Kb
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Gluttton
Дата 18.10.2009, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Так читабельнее:
Код

select
    NM.name_new,
    NM.id,
    NM.description,
    NM.name1,
    NM.name2,
    NM.price as MinPrice,
    F.name
from "NAMES" as NM, Files as F
    where NM.file_id=F.id
    and NM.price=
    (
        select min(SN.price)
        from "NAMES" AS SN
           where NM.name_new=SN.name_new
    )


Добавлено через 2 минуты и 19 секунд
Цитата(lat @  18.10.2009,  01:09 Найти цитируемый пост)
эх ... у меня на AD возвращает почему - то 1 результат (((видно придется думать о смене СУБД, другого выхода увы не вижу.


А исходные данные такие же как и мне были переданы?

Я понимаю, что если бы ошибка была... Но одна строка в результате...


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


Шустрый
*


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

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



Цитата(Gluttton @  18.10.2009,  01:10 Найти цитируемый пост)
select
    NM.name_new,
    NM.id,
    NM.description,
    NM.name1,
    NM.name2,
    NM.price as MinPrice,
    F.name
from "NAMES" as NM, Files as F
    where NM.file_id=F.id
    and NM.price=
    (
        select min(SN.price)
        from "NAMES" AS SN
           where NM.name_new=SN.name_new
    )


АААААААААААААААААААА!!!! УУУУУУУУУУУУУУУУУ!!! Счастья наступило!!!
Чэл, огромное те спасибо!
Работает! =)
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Gluttton
Дата 18.10.2009, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Нужно разобраться до конца smile !

Ура!

Сейчас я пойду пить вино, а потом спать, а завтра (если интересно будет) расскажу, что я думаю о структуре БД и о том, как бы было проще, если бы БД была бы реализована тремя таблицами, то было бы проще smile ...

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


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


Шустрый
*


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

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



Мог бы, поставил бы те плюс =)

Добавлено через 36 секунд
Цитата(Gluttton @  18.10.2009,  01:14 Найти цитируемый пост)
Нужно разобраться до конца smile ! 


так а что ещё осталось ... вроде ж работает? )
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Gluttton
Дата 18.10.2009, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



 smile 
Цитата(lat @  18.10.2009,  01:14 Найти цитируемый пост)
Чэл, огромное те спасибо!

Пожайлуста smile ...
Цитата(lat @  18.10.2009,  01:15 Найти цитируемый пост)
Мог бы, поставил бы те плюс =)

Это не главное  smile , главное, что задача решена smile ...

Предлагаю закрывать тему, а то модераторы завтра прийдут и надают нам обоим по шапке за то что мы тут флуд на полсотни сообщений развели smile ...





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


Шустрый
*


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

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



Цитата(Gluttton @  18.10.2009,  01:19 Найти цитируемый пост)
Предлагаю закрывать тему, а то модераторы завтра прийдут и надают нам обоим по шапке за то что мы тут флуд на полсотни сообщений развели smile ...


Ну так сам же писал "главное что задача решена", а кол-во сообщений это такое ... побочный продукт на пути к дзену) 
Для того форум и существует что б помогать решать задачи =)



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


Шустрый
*


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

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



Поспешил с выводами. Задачка решена на 50%, продолжаем дальше мозго-штурм господа.

Когда цены одинаковые для одинаковых товаров, то выводит дубликаты. 

ЗЫ повторил эту ситуацию все в том же файле Tovar.sql. Есть 10 записей,  должно вывести 5 (кол-во оригинальных товаров, без дубликатов и с мин. ценой) после запроса. А выводит больше 5-ти, то есть кроме всего остального также показывает товар с одинаковой ценой но с разным источником (прайсом). Так что вот так =)



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


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


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

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



Цитата(lat @  18.10.2009,  02:40 Найти цитируемый пост)
Когда цены одинаковые для одинаковых товаров, то выводит дубликаты. 

А по какому критерию определять запись поподающую в выборку при одинаковой цене?

Я так пологаю, что правильно было бы в тех случаях, когда цена минимальна в обоих прайсах выводить в графе с прайсами оба прайса (производить конкатенацию строк). Это можно реализовать рекурсивным запросом. Не все СУБД поддерживают рекурсивные запросы, но вот Firebird например поддерживает.
Вот тут и тут несколько примеров.
Firebird бесплатен и имеет embedded версию (т.е. для запуска сервера не обязательно производить установку его установку на ПК конечного пользователя, а достаточно "носить" в одной папке с программой несколько dll-ек). Я это к тому, что если реализация проекта не зашла далеко, то возможно стоит подумать о смене СУБД... Кроме Firebird существуют ещё и MySQL PosgreSQL а так же экспресс версии Oracle, MS SQL Server и многое другое например такое как SQLite...

Ещё раз хочу обратить внимание на то что испльзуемая структура БД неверна! Детально почитать об этом можно спросив у Googl'а про такое: "анамалия вставки", "аномалия удаления", "аномалия обновления". На пальцах приведу примеры недостатков...
1. БД не может хранить информацию о товаре, который отсутствует во всех прайсах.
2. Если характеристики товара изменились, то для обновления информации о товаре необходимо внести изменения во все строках, где он упоминается, а не в одном единственном месте.

А должно быть примерно так:
(ещё раз напомню, что это классическая реализация связи "многие ко многим")
Таблица "Товары" в которой описываются все товары, каждый товар упоминается один раз. Тут можно указать марку, производителя, основные характеристикие.
Таблица "Продавец" в которой описываются все продавцы (будь то фирмы, будь то частные лица или же интернет ресурсы). Тут можно хранить информацию о продавцах.
И "третья" связующая таблица "Товары_у_Продавца" (или же просто "Прайс" или ещё как нибудь назвать) в которой храняться как минимум (это обязательно) внешние ключи как на Товары так и на Продавцев. Так же можно хранить здесь информацию, которая характерна для данного образца Товара у конкретного Продавца это может быть и цена и гарантийный срок и ещё что нибудь...

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


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


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


Шустрый
*


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

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



Цитата(Gluttton @  18.10.2009,  10:37 Найти цитируемый пост)
А по какому критерию определять запись поподающую в выборку при одинаковой цене?


Ниче не понял)))

Цитата(Gluttton @  18.10.2009,  10:37 Найти цитируемый пост)
Ещё раз хочу обратить внимание на то что испльзуемая структура БД неверна! Детально почитать об этом можно спросив у Googl'а про такое: "анамалия вставки", "аномалия удаления", "аномалия обновления". На пальцах приведу примеры недостатков...
1. БД не может хранить информацию о товаре, который отсутствует во всех прайсах.
2. Если характеристики товара изменились, то для обновления информации о товаре необходимо внести изменения во все строках, где он упоминается, а не в одном единственном месте.


Согласен с тем что спроектировано "на скорую руку" и несколько непонятно на первый взгляд. Но есть пару но. 

1. БД и не должна хранить инфу о товаре, который отсутствует  во всех прайсах. Потому что такого быть не может. Программа собирает инфу с прайсов, и не откуда более. И источник у товара всегда будет.  Это первое.
2. Каждый раз при анализе новых/старых прайсов вся инфа сбрасывается. БД очищается. То есть ничего обновлять не нужно. При каждом анализе происходит новое заполнение. И сама БД, в этом случае, это лишь кэш-буфер который неплохо справляется с поиском похожих товаров и "конкатенацией" этих товаров по минимальной цене)))

Для данной программы эта структура БД вполне подходит. А сама СУБД используется лишь с целю нахождения и выделения "оптимальной покупки", как временное хранилище.

ЗЫ знаю что звучит как-то не так. Но поверьте, по соотношение потраченное_время/качество эта схема вполне приемлема. 



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


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


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

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



Цитата(lat @  18.10.2009,  20:57 Найти цитируемый пост)
ЗЫ знаю что звучит как-то не так. Но поверьте, по соотношение потраченное_время/качество эта схема вполне приемлема. 

Да я и не против smile ...

Цитата(lat @  18.10.2009,  20:57 Найти цитируемый пост)
Ниче не понял)))

Когда дядя Петя идет на рынок ему тетя Сара говорит: "... купи самой дешёвой картошки". Дядя Петя приходит и видит, что по самой дешевой цене картошка продается в трех точках, тогда он звонит по мобильному тете Саре и спрашивает, какую именно выбрать, а тётя Сара ему говорит: "... из всех картошек по самой дешевой цене купи самую крупную, а если и крупная будет в нескольких точках, то купи ту до которой ближе идти smile ".

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



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


Шустрый
*


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

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



Прикольно ты про Петю )))
Мне понравилось, вот если бы так все рассказывали, лаконично и понятно!)))


Цитата(Gluttton @  18.10.2009,  21:23 Найти цитируемый пост)
Я например не считаю, тот факт, что попадут оба ошибкой...

Я тоже не считаю это ошибкой.

Результаты будут сохраняться в файле, который будет потом передаваться на сайт роботу (не железному, а php ному =). Так вот робот просто не поймет почему ему дали два и более товара с одинаковыми характеристиками (робот не будет знать о источнике товара, только название - цена).

Так что не имеет значения какой из одинаковых товаров попадет в выборку, у них нет приоритета (по крайней мере в данной версии ПО такого не планирую ;)
Ну или " ... то купи ту до которой ближе идти" )))))



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


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


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

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



Цитата(lat @  18.10.2009,  21:43 Найти цитируемый пост)
Ну или " ... то купи ту до которой ближе идти" )))))

Самый простой способ реализовать выбор только одного товара - использовать ключевое слово DISTINCT. Использование SELECT DISTINCT позволяет отображать только разные записи. Т.е. для таблицы:
Код

t1:
А     B
1    1
1    1
1    2
2    1

Запрос:
Код

select A from t1

Вернёт:
Код

1
1
1
2

А запрос:
Код

select distinct A from t1

Вернёт:
Код

1
2

Но в то же время запрос:
Код

select distinct A, B from t1

Вернёт:
Код

1    1
1    2
2    1

Я это всё к чему... У нас получается, что у двух товаров все данные одинаковые, кроме имени файла и первичного ключа...
Но т.к.
Цитата(lat @  18.10.2009,  21:43 Найти цитируемый пост)
(робот не будет знать о источнике товара, только название - цена)

То решение лежит на поверхности:
1. Отказываемся от выбора поля с именем файла и с кодом товара.
2. Добавляем в запрос ключевое слово DISTINCT.
Код

select distinct
    NM.name_new,
    NM.description,
    NM.name1,
    NM.name2,
    min(NM.price) as MinPrice
from "NAMES" as NM, Files as F
    group by 
        NM.name_new, 
        NM.description, 
        NM.name1, 
        NM.name2

Опробировал на своей БД - работает...
Вот такой результат:
user posted image
Ну а если мы не может отказаться от полей первичного ключа и имени файла, то начнуться "танцы с бубном" smile ...

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


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


Шустрый
*


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

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



Цитата(Gluttton @  18.10.2009,  22:01 Найти цитируемый пост)
Ну а если мы не может отказаться от полей первичного ключа и имени файла, то начнуться "танцы с бубном" smile ...


угу. пущай начнутся танцы =)

ибо для робота эти поля не нужны, а вот мне они ой как важны)

Добавлено через 10 минут и 9 секунд
1 файл я создаю для робота
2 файл для себя (в нем полная инфа о товарах, в том числе и источник)
так что distinct тут не поможет (
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




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


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

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