0
votes

Combiner trois tables avec deux valeurs dynamiques

J'essaie de créer une base de données pour un jeu de devinettes où un joueur devrait deviner la valeur d'un produit donné. J'ai trois tables;

une table pour les produits avec les colonnes suivantes:

  • ProductID
  • Nom de produit (Varchar)

    une table pour les joueurs avec les colonnes suivantes

    • playerid
    • Playername (Varchar)

      une table où les joueurs, les produits et leurs suppositions sont stockés, c'est-à-dire

      • DIGIANDID
      • playerid
      • ProductID
      • devinez (int)

        Je vais essayer de trouver un moyen de combiner quel joueur (nom de Playern) qui a remporté le plus haut produit (devinez) pour chaque produit (produitName), c'est-à-dire un moyen de résumer chaque produit, le plus élevé Pour chaque produit et le nom du joueur OCH qui a fait le devin.

        Jusqu'à présent, je n'ai pu obtenir que le nom de produit correct et la valeur de conjecte correcte pour chaque produit. D'une manière ou d'une autre, cela ne fonctionne pas pour le nom de jeu et je continue à obtenir le mauvais nom à chaque fois. xxx

        Je suppose que mon problème est que chaque ligne liée à un produit spécifique contient deux valeurs dynamiques; Devinez et playerid qui me donne des problèmes chaque fois que j'essaie de trier par max (devinez). Je ne peux avoir aucun sens de la playiday qui est choisi pour la requête indiquée ci-dessus. Cela n'a aucun sens pour moi.

        J'apprécierais que l'un de vous, que des gars puissent me signaler dans la bonne direction.

        acclamations.


3 commentaires

"Cela n'a aucun sens pour moi." Parce que votre requête n'a pas de sens, car ce n'est pas un ansi SQL .. Utilisé des colonnes non agrégées dans la clause SELECT devraient également être dans le groupe par clause d'ANSI SQL valide .. mysql Étend le groupe par une "fonctionnalité" où cela n'est pas nécessaire mais peut causer des données non valides.


.. Plus les versions MySQL modernes Il est possible de désactiver le groupe étendu par une fonctionnalité SQL_MODE appelée uniquement_full_group_by .. BESIDEI Vous vous conseillerez de lire Ceci et nous fournir des exemples de données et des résultats attendus.


Je ne comprends pas tout à fait ce que vous essayez de faire, mais je pense que vous devez le faire récursivement ou avec 2 requêtes et une table Temp. Lorsque j'essaie de solder des requêtes compliquées, je vais généralement écrire plusieurs requêtes simples, puis chercher la meilleure façon de les combiner. Dans votre cas, vous pouvez sélectionner la supposition max pour chaque produit, puis utiliser ce résultat pour interroger pour qui a fait que max devinez. Vous devrez faire face à des choses comme ce qui se passe lorsque 2 joueurs avaient la même max devineuse, etc. que vous ne traitez pas maintenant.


3 Réponses :


0
votes

Vous pouvez utiliser la dernière valeur dans cette requête. Vous pouvez également utiliser la première valeur en commandant Desc (vous n'avez pas à donner une précédente non liée et suivante. En outre, cela est basé sur l'hypothèse selon laquelle la supposition est unique dans le nom du produit, de sorte que la commande soit cohérente.

échantillon de données et La production aurait aidé à voir si elle est attendue ou non, mais je pense que cela fonctionnera ici en fonction de ce que vous avez mentionné. P>

SELECT distinct   p.ProductName,
last_value(Guess) over (partition by p.ProductName order by Guess  rows between 
unbounded preceding and unbounded following )  GuessNumber, 
last_value(pl.PlayerName) over (partition by p.ProductName order by Guess rows 
between unbounded preceding and unbounded following ) PlayerName
FROM guess g
inner join player pl on g.PlayerID = pl.PlayerID
inner join product p on g.ProductID = p.ProductID


1 commentaires

Fonctions Windows fonctionne uniquement dans MySQL 8.0+ par la manière dont vous avez oublié de mentionner cela ..



1
votes

Utilisez une sous-requête corrélée pour sélectionner la supposition la plus élevée pour chaque produit, puis sélectionnez les acteurs associés et les enregistrements de produits dans la requête extérieure, comme:

SELECT 
    p.productname, u.playername, g.guess as "max guess" 
FROM 
    guess_table g
    INNER JOIN product_table p ON p.productid = g.productid
    INNER JOIN players_table u on u.playerid = g.playerid
WHERE g.guess = (SELECT MAX(guess) FROM guess_table WHERE productid = p.productid)


1 commentaires

Ça l'a fait! Merci! Cela a plus de sens que d'utiliser «groupe par», maintenant que j'ai la requête correcte :). Encore une fois merci!



0
votes

Une méthode consiste à utiliser quelque chose d'un piratage dans MySQL:

SELECT SUBSTRING_INDEX(GROUP_CONCAT(pl.PlayerName ORDER BY g.guess DESC), ',', 1) as PlayerName,
       MAX(g.Guess), p.ProductName
FROM guess g JOIN
     player pl
     ON g.PlayerID = pl.PlayerID JOIN
     product p 
     ON g.ProductID = p.ProductID
GROUP BY p.ProductName;


0 commentaires