Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
помогите составить sql запрос (2) (Raphael) 06/05/2004 - 02:15:39
      Re: поточнее (Sam) 06/05/2004 - 14:39:45
      Re: поточнее (Raphael) 06/05/2004 - 15:09:58
      Re: поточнее (Raphael) 06/05/2004 - 15:10:11
      Re: sql запрос с использованием вложеных! (Raphael) 07/05/2004 - 00:26:32
      Re: так? (Sam) 07/05/2004 - 02:01:32
      Re: Сумма контракта (Sam) 07/05/2004 - 02:05:18
      Re: не так (Raphael) 07/05/2004 - 14:02:17
      Re: наверное так (Sam) 07/05/2004 - 22:12:31
      Re: подзапросы не работают (Raphael) 08/05/2004 - 02:14:08
      Re: так? (Kroha) 27/05/2005 - 13:14:34

> Original message text:
> From: Raphael - 06/05/2004 - 02:15:39
> Subject: помогите составить sql запрос (2)
> -----------------
> Здравствуйте, помогите составить sql запрос
> есть 2 таблицы
> 1 - список контрактов,
> contracts
> contract_id
> 2 - список предложений по покупке/продаже этих контрактов
> proposals
> proposal_price
> proposal_quantity
> proposal_contract_id
>
> требуется выбрать все контракты, с максимальной ценой покупки и
> продажи и количеством акций.
>
> я пока скачиваю все таблицы в php и вручную обрабатываю массивы
> первый запрос
>
> SELECT * , sum( IF (proposal_quantity <0, -proposal_quantity, 0) ) AS n_ask,
> sum( IF (proposal_quantity >0, proposal_quantity, 0) ) AS n_bid
> FROM `proposals`
> GROUP BY `proposal_price`
>
> теперь в получившився результате надо бы взять максимум proposal_price и сгрупировать по proposal_contract_id
>
> и последнее
> SELECT * FROM `contracts`
> LEFT JOIN (тот результат который получился после суммирования и взятия максимума) ON (proposal_contract_id = contract_id)
>
> ну хоть как нибудь и гденибудь переложить часть работы на базу, а то я всё делаю в скрипте и боюсь в будущем перестану укладыватся в ограничения.
>


From: Sam - 07/05/2004 - 02:01:32
Subject:так?
-----------------
Есть табличка
proposals (proposal_price, proposal_quantity, proposal_contract_id)
И табличка contracts.
В одном контракте несколько акций (proposals)
Тебе нужно выбрать контракты у которых максимальная цена покупки, контракты у которых минимальная цена покупки (у тебя же там минус, макс цена продажи и мин цена покупки одно и то же) и контракты у которых максимальное кол-во акций.

Сначала ищем 3 цифры (максимальная цена, минимальная, цена и максимальное количество).
Здесь цены относятся к акциям а кол-во к контрактам
SELECT max(proposal_price), min(proposal_price) FROM proposals
Потом
SELECT count(*) FROM proposals GROUP BY proposal_contract_id ORDER BY count(*) DESC LIMIT 1

И далее выбрать то что нужно
SELECT * FROM contracts WHERE contract_id IN (SELECT contract_id FROM proposals WHERE price = max_price OR price = min_price)

Ой, что-то сложно получается... Нужно еще сгруппировать по всем полям контракта и count(proposal_id) и добавить HAVING count(proposal_id) = max_count

SELECT contract_id, count(proposal_id) FROM contracts WHERE contract_id IN (SELECT contract_id FROM proposals WHERE price = max_price OR price = min_price) GROUP BY cont

Нет, не выходит каменный цветок :(

Знаешь, на твоем месте я бы нарисовал диаграмму твоей базы. В ней отобразил бы все поля. Стрелочками указал связи, указал бы первичные ключи, внешние ключи. А потом проверил структуру базы на соответствие нормальным формам реляционных баз данных.

О нормальных формах почитай хотя бы здесь http://alpha.netis.ru/win/db/ch_4_2.html их не просто понять, но можно.

Если база соответствует нормальным формам то все запросы к ней простые и удобные.


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
22227



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |