1
votes

Comment deux se joignent aux tables en fonction de la valeur la plus élevée de l'une d'entre elles?

J'ai une table nommée Enchère qui contient un AuctionID . J'ai une autre table nommée bid qui contient le AuctionID (en tant que clé étrangère) et quel était le montant.

Ce que je veux faire, c'est lister le AuctionID dans une colonne et le montant de l'enchère la plus élevée dans l'autre colonne.

J'ai essayé différentes façons de faire des jointures internes pour que cela s'affiche correctement, mais j'ai horriblement échoué. Veuillez garder à l'esprit que je suis un novice total en matière de MYSQL et que la solution pourrait très bien être que je devrais revenir en arrière et repenser toute la base de données.

Le plus proche que j'ai pour afficher ce que je veux est les deux méthodes ci-dessous.

La première

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

La seconde est la suivante

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

Le premier affiche toutes les offres qui ont été faites et leur montant, mais je ne veux que l'enchère la plus élevée sur chaque auctionID .

Le second n'affiche que l'absolu l'enchère la plus élevée jamais faite sur toutes les enchères différentes et quel AuctionID avait cette enchère spécifique.

Je suppose que j'ai besoin d'une sorte d'énoncés de jointure imbriqués, mais je ne peux vraiment pas comprendre

Merci d'avance!

Edit: Quelle belle expérience. En tant qu'utilisateur de longue date qui, par désespoir, a créé un compte aujourd'hui pour poser ma première question. J'ai reçu une aide formidable de cette communauté.

La réponse:

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

Fournie par Caius Jard et Deependra Bhandari


2 commentaires

@ haag1 MySQL ne prend pas en charge CROSS APPLY , et même si c'était le cas, je ne suis pas sûr que vous souhaitiez l'utiliser ici.


Variation intéressante dans les interprétations de cette question - clairement un bon exemple de la raison pour laquelle Strawberry a le MCVE Q sur la numérotation abrégée


4 Réponses :


0
votes

Regroupez le tableau des enchères avant de rejoindre

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

Vous obtiendrez ainsi les détails de chaque enchère (y compris l'ID) et uniquement l'enchère maximale pour chaque enchère

Deependra a fait un bon point; vous avez dit que vous ne vouliez vraiment que l'enchère et l'enchère maximale et cette information peut être dérivée uniquement du tableau des enchères (la sous-requête aliasée comme b dans mon code ci-dessus, donc si c'est vraiment tout ce dont vous avez besoin, supprimez ma requête jusqu'à la sous-requête. Si vous souhaitez plus tard toutes les autres informations sur une enchère, ainsi que son enchère maximale, utilisez la requête ci-dessus

Si vous voulez toutes les informations sur l'enchère et toutes les informations sur l'enchère max, pour chaque enchère, vous pouvez le faire ainsi:

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

Cela renverra toutes les informations sur une enchère et toutes les informations sur l'enchère maximale. J'espère que vous n'autorisez que des enchères uniques, sinon, nous allons entrer dans un scénario d'enchère maximale "le plus récent" plus compliqué


4 commentaires

Merci! Cela aide beaucoup! Mais ce n'est pas exactement ce que je veux. cela affiche toutes les données contenues dans les deux tables. Je veux seulement afficher l'enchère.auctionID et bid.bid.


Consultez la note que j'ai faite à propos de "utilisez simplement la sous-requête", c'est-à-dire SELECT Auctionid, MAX (bid) as maxbid FROM bid GROUP BY Auctionid si c'est tout ce que vous voulez - si vous voulez plus d'informations sur l'enchère ou l'enchère, voici comment vous pouvez la lier dans


Merci beaucoup! Cela fonctionne très bien! Et si facile! Hahaha. je me suis battu pendant deux jours à ce sujet. Que toi!


Pas de problème. si une réponse est utile, cliquez sur la flèche vers le haut au-dessus du nombre. Si vous pensez qu'une réponse particulière est la bonne réponse à votre problème, cliquez sur la case à cocher Marl. Une seule réponse peut être cochée comme réponse acceptée, mais de nombreuses réponses peuvent être votées à la hausse, si elles ajoutent quelque chose d'utile ou d'utile. Quand je demande, j'ai tendance à monter ET à cocher la «bonne» réponse, et les autres qui contenaient des faits supplémentaires utiles



0
votes

Si vous n'avez besoin que de deux colonnes et que les deux sont disponibles dans le tableau des enchères, pourquoi vous créez une jointure. Utilisez le suivant.

CHOISISSEZ l'enchèreID, max (enchère) comme la facture la plus élevée de l'offre grouper par AuctionID;


0 commentaires

1
votes

Je pense que vous voulez juste une requête 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;

Cela suppose que vous souhaitiez trouver l'offre la plus élevée pour chaque enchère.


0 commentaires

0
votes

Si vous souhaitez retirer l ' enchère de l'enchère ayant le montant le plus élevé pour une enchère donnée, utilisez un JOIN avec une sous-requête corrélée:

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 commentaires