Как два соединяются с таблицами на основе наибольшего значения в одной из них? - PullRequest
0 голосов
/ 04 января 2019

У меня есть таблица с именем Auction, которая содержит auctionID. У меня есть другая таблица с именем bid, которая содержит auctionID (в качестве внешнего ключа) и какую сумму.

Я хочу перечислить auctionID в одном столбце и сумму наибольшей ставки в другом столбце.

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

Самое близкое, что я хочу показать, - это два разных метода ниже.

Первый

SELECT auction.auctionID, bid.bid
from bid
INNER JOIN 
auction on auction.auctionsID = bid.auctionsID;

Второй выглядит следующим образом

SELECT auction.auctionsID, bid.bid 
from bid
INNER JOIN 
auction on auction.auctionsID = bid.auctionsID
where bid.bid = (select max(bid.bid) from bid);

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

Второй показывает только самую высокую ставку, когда-либо сделанную на всех аукционах, и то, что auctionID было на этом аукционе.

Я предполагаю, что мне нужны какие-то вложенные операторы соединения, но я действительно не могу обернуться вокруг этого.

Заранее спасибо!

Редактировать: Какой замечательный опыт. Как давний пользователь, который в отчаянии создал учетную запись сегодня, чтобы задать мой первый вопрос. Я получил потрясающую помощь от этого сообщества.

Ответ:

SELECT auctionid, MAX(bid) as maxbid FROM bid GROUP BY auctionid;

Предоставлено Гайом Джардом и Деепендрой Бхандари

Ответы [ 4 ]

0 голосов
/ 04 января 2019

Если вы хотите получить bid ставки, имеющей наибольшую сумму для данного аукциона, используйте JOIN с соответствующим подзапросом:

SELECT a.auctionsID, b.bid 
FROM 
    bid
    INNER JOIN auction a
        ON  a.auctionsID = b.auctionsID
        AND b.amount = (SELECT MAX(amount) FROM bid WHERE bid = b.bid)
0 голосов
/ 04 января 2019

Если вам нужны только два столбца, и оба доступны в таблице ставок, почему вы делаете соединение. Используйте следующий.

ВЫБЕРИТЕ идентификатор аукциона, максимальная (ставка) как Highest_Invoice от заявки группировка по аукциону;

0 голосов
/ 04 января 2019

Я думаю, вы просто хотите запрос GROUP BY:

SELECT
    a.auctionID, MAX(b.bid) AS max_bid
FROM auction a
INNER JOIN bid b
    ON a.auctionsID = b.auctionsID
GROUP BY
    a.auctionID;

Предполагается, что вы хотите найти самую высокую ставку для каждого аукциона.

0 голосов
/ 04 января 2019

Сгруппируйте таблицу ставок, прежде чем присоединиться

SELECT * FROM
  auction a
  INNER JOIN
  (SELECT auctionid, MAX(bid) as maxbid FROM bid GROUP BY auctionid) b
  on a.auctionid = b.auctionid

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

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

Если вы хотите получить всю информацию об аукционе и всю информацию maxbid для каждого аукциона, вы можете сделать это следующим образом:

SELECT * FROM
  auction a
  INNER JOIN
  bid b 
  ON a.auctionid = b.auctionid
  INNER JOIN
  (SELECT auctionid, MAX(bid) as maxbid FROM bid GROUP BY auctionid) mb
  on a.auctionid = mb.auctionid and b.bid = mb.maxbid

Это вернет всю информацию об аукционе и всю информацию о максимальной ставке. Надеемся, что вы разрешаете только уникальные ставки, в противном случае мы попадем в более сложный «последний» сценарий максимальной ставки

...