Использование SQL для получения отдельных строк, а также всей строки для них - PullRequest
2 голосов
/ 06 июля 2011

Хорошо, проще привести пример, и, надеюсь, у кого-то есть решение:

У меня есть таблица, в которой содержатся ставки:

ID | companyID | userID | contractID | bidAmount | dateAdded

Ниже приведен пример набора строк, который может бытьв таблице:

ID | companyID | userID | contractID | bidAmount | dateAdded
--------------------------------------------------------------
10 | 2         | 1      | 94         | 1.50      | 1309933407
9  | 2         | 1      | 95         | 1.99      | 1309933397
8  | 2         | 1      | 96         | 1.99      | 1309933394
11 | 103       | 1210   | 96         | 1.98      | 1309947237
12 | 2         | 1      | 96         | 1.97      | 1309947252

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

Поэтому мне понадобятся следующие строки:

ID = 10 (for contractID = 94)
ID = 9 (for contractID - 95)
ID = 12 (for contractID = 96)

Я хочу игнорировать все остальные.Я думал об использовании DISTINCT, но я не смог заставить его вернуть все столбцы, только столбец, который я использую для различных.

У кого-нибудь есть какие-либо предложения?

Спасибо, Джефф

Ответы [ 4 ]

6 голосов
/ 06 июля 2011
select *
from mytable main
where bidAmount = (
    select min(bidAmount)
    from mytable
    where contractID = main.contractID)

Обратите внимание, что будет возвращено несколько строк, если существует более одной записи с одинаковой минимальной ставкой.

1 голос
/ 06 июля 2011

Не проверял, но это возможно с этим запросом, хотя это может быть не очень быстро:

SELECT * FROM bids WHERE ID IN (
  SELECT ID FROM bids GROUP BY contractID ORDER BY MIN(bidAmount) ASC
)

Это будет запрос для MySQL, возможно, вам нужно настроить его для другой базы данных.

0 голосов
/ 06 июля 2011

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

Подзапросы - это ваш ответ, и где-то в приведенных выше предложениях, вероятно,ответ.Ваш подзапрос должен вернуть идентификаторы или строки с минимальным значением ставки.Затем вы можете выбрать * из строк с этими идентификаторами.

0 голосов
/ 06 июля 2011

Вы можете использовать подзапрос, чтобы найти наименьший идентификатор строки в расчете на сокращение:

select  *
from   YourTable
where  id in 
       (
       select  min(id)
       from    YourTable
       group by
               ContractID
       )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...