Est-ce qu'il y a des développeurs pour m'aider sur une requête SQL ?

TheAngels
2022-12-31 12:02:58

Khey ta table classement n'a aucun sens.
1 ligne = 1 entité, mettre tous dans une ligne n'a pas d'intérêt.
Fais comme vdd l'a dit, tu garde juste l'id du joueur dans classement ou tu vires cette table et tu gardes juste une colonne"meilleur_score" dans joueurs qui te permettra d'avoir le classement avec un order by

0dose-0test
2022-12-31 12:04:55

Column count doesn't match value count at row 1 = t'essaies d'insérer 5 valeurs sur la même ligne alors que la le select renvoie 5 lignes avec 1 seulement une seule valeur, en gros si tu veux que ça marche :

INSERT INTO classement (joueur_1, joueur_2, joueur_3, joueur_4, joueur_5)
SELECT nom, nom, nom, nom, nom
FROM joueurs
WHERE score > 0
ORDER BY score DESC
LIMIT 5

sauf que le schéma de classement est clairement pourri, le mieux c'est de faire ça si tu veux garder un historique.

CREATE TABLE classement (nom varchar(50), score double, date DATETIME);

INSERT INTO classement (nom, score, date)
SELECT nom, score, NOW()
FROM joueurs
WHERE score > 0
ORDER BY score DESC
LIMIT 5

PoubzDep15
2022-12-31 12:06:06

[12:02:58] <TheAngels>
Khey ta table classement n'a aucun sens.
1 ligne = 1 entité, mettre tous dans une ligne n'a pas d'intérêt.
Fais comme vdd l'a dit, tu garde juste l'id du joueur dans classement ou tu vires cette table et tu gardes juste une colonne"meilleur_score" dans joueurs qui te permettra d'avoir le classement avec un order by

C'est vrai aussi.

C'est pour ça que les autres te disaient de faire un print. Car la seule utilité de faire un pivot, c'est d'améliorer l'affichage de la table. Mais c'est pas le genre de table avec laquelle que tu es censé travailler.

PasseVaccinal
2022-12-31 12:07:06

Le 31 décembre 2022 à 12:02:58 :
Khey ta table classement n'a aucun sens.
1 ligne = 1 entité, mettre tous dans une ligne n'a pas d'intérêt.
Fais comme vdd l'a dit, tu garde juste l'id du joueur dans classement ou tu vires cette table et tu gardes juste une colonne"meilleur_score" dans joueurs qui te permettra d'avoir le classement avec un order by

Mais la table classement c'est en fait une table d'historique. Elle doit pouvoir comporter autant de classement différent que de ligne. C'est toujours plus pratique que de créer une table par classement ou de rajouter des colonnes à l'infini dans ma table joueurs.

ClarkKentSG-1
2022-12-31 12:09:37

vous bossez dans quoi en sql mes cles ?https://image.noelshack.com/fichiers/2021/02/7/1610904312-risitas-blase-zoom-hd-lunette.png

PasseVaccinal
2022-12-31 12:14:34

Moi je bosse du tout dans le domaine, c'est juste un un petit jeu perso que je fais en autodidacte. J'apprends tout sur le tas

PasseVaccinal
2022-12-31 12:21:12

Le 31 décembre 2022 à 12:04:55 :
Column count doesn't match value count at row 1 = t'essaies d'insérer 5 valeurs sur la même ligne alors que la le select renvoie 5 lignes avec 1 seulement une seule valeur, en gros si tu veux que ça marche :

INSERT INTO classement (joueur_1, joueur_2, joueur_3, joueur_4, joueur_5)
SELECT nom, nom, nom, nom, nom
FROM joueurs
WHERE score > 0
ORDER BY score DESC
LIMIT 5

sauf que le schéma de classement est clairement pourri, le mieux c'est de faire ça si tu veux garder un historique.

CREATE TABLE classement (nom varchar(50), score double, date DATETIME);

INSERT INTO classement (nom, score, date)
SELECT nom, score, NOW()
FROM joueurs
WHERE score > 0
ORDER BY score DESC
LIMIT 5

Ca ne fonctionne pas car ça me crée 5 lignes, où chaque ligne à le même joueur dupliqué sur les 5 colonnes.
Peut-être que si j'utilise des UNION ALL je peux m'en sortir

Ta seconde méthode à l'air pas mal, même c'est pas tout à fait ce que je veux mais je vais regarder. J'aurais préféré une ligne par classement plutôt que de devoir ensuite filtrer sur la date.

XXXegal30
2022-12-31 12:22:54

Le 31 décembre 2022 à 11:47:58 azqsdxcvcfgfnnn a écrit :
Sans même connaitre le projet on voit tout de suite que cette table classement ne sert à rienhttps://image.noelshack.com/fichiers/2021/04/4/1611841177-ahiahiahi.png

C'est vraiment créé de façon dégueulasse c'est vrai. :(

3ch0es
2022-12-31 12:25:06

Tu veux vraiment une colonne par joueur ? Où dans ton classement tu pourrais avoir deux colonnes ?
Colonne 1 : la date du classement, colonne 2: le classement des joueurs ?

Si oui, un group_concat ferait le boulot mais il te faudra toujours retravailler la colonne 2 pour l'affichage sur ton interface.

TheAngels
2022-12-31 12:26:00

Le 31 décembre 2022 à 12:07:06 :

Le 31 décembre 2022 à 12:02:58 :
Khey ta table classement n'a aucun sens.
1 ligne = 1 entité, mettre tous dans une ligne n'a pas d'intérêt.
Fais comme vdd l'a dit, tu garde juste l'id du joueur dans classement ou tu vires cette table et tu gardes juste une colonne"meilleur_score" dans joueurs qui te permettra d'avoir le classement avec un order by

Mais la table classement c'est en fait une table d'historique. Elle doit pouvoir comporter autant de classement différent que de ligne. C'est toujours plus pratique que de créer une table par classement ou de rajouter des colonnes à l'infini dans ma table joueurs.

Dans ce cas tu peux rajouter une colonne dans la table classement qui va te permettre d'historiser tes données. Ca peut être une date, un numéro de version, etc.

Tu aurais par ligne: id_joueur, score, version

Ca te permet de recup l'historique de la version 3 par exemple, reste plus qu'à trier les résultats par score.

C'est plus flexible comme ca, tu pourrais agrandir ton classement à 10 joueurs sans rajouter de colonnes par exemple.

PasseVaccinal
2022-12-31 12:53:27

certes c'est tentant mais je ne souhaite pas stocker le score dans la table classement pour la bonne raison que le score ce n'est pas un valeur mais en réalité une conséquence de plusieurs paramètres dans la table joueurs (temps, nombre de coup, victoire, échec...)
J'ai simplifié l'énoncé ici car mon objectif c'est vraiment de convertir le résultat d'un select qui retourne 5 lignes dans 5 colonnes d'une autre table, sur une seule ligne.
Je regarde PIVOT, ça pourrait m'aider

PasseVaccinal
2022-12-31 13:57:28

Pour info, j'ai réussi comme ça :

INSERT INTO classement (joueur1, joueur2, joueur3, joueur4, joueur5)
SELECT joueur1, joueur2, joueur3, joueur4, joueur5 FROM (
SELECT nom AS joueur1,
(SELECT nom FROM joueurs WHERE score > 0 AND nom != joueur1 ORDER BY score DESC LIMIT 1) AS joueur2,
(SELECT nom FROM joueurs WHERE score > 0 AND nom NOT IN (joueur1, joueur2) ORDER BY score DESC LIMIT 1) AS joueur3,
(SELECT nom FROM joueurs WHERE score > 0 AND nom NOT IN (joueur1, joueur2, joueur3) ORDER BY LIMIT 1) AS joueur4,
(SELECT nom FROM joueurs WHERE score > 0 AND nom NOT IN (joueur1, joueur2, joueur3, joueur4) ORDER BY LIMIT 1) AS joueur5
FROM joueurs
WHERE score > 0
ORDER BY score DESC
LIMIT 1
) AS temp;

Ingeniax
2022-12-31 14:06:24

Demandes à Chat GPT l'op

PasseVaccinal
2022-12-31 14:07:54

Le 31 décembre 2022 à 14:06:24 :
Demandes à Chat GPT l'op

C'est ce que j'ai fait pour trouver ça. Mais je ne suis pas fan des sous-requête , ça alourdi. Là je lui demande de simplifier, ile me sort des jointures, à voir

PoubzDep15
2022-12-31 14:15:46

Et le pivot que je t'ai montré page 1 ça marche pas ? Sinon, demande toi comment tu vas interroger la table et tu verras que c'est pas pratique. Tu veux le classement d'une partie X tu vas devoir faire un select * et utiliser une boucle pour lire chaque colonne. C'est dégueulasse.
Le mieux serait d'ecrire le classement de la partie dans une nouvelle table en gardant uniquement les cinq premiers, et en utilisant une colonne id_partie et rank.
C'est bcp plus simple et rapide à interroger.

PoubzDep15
2022-12-31 14:16:01

[12:02:00] <PoubzDep15>
Essaie une query pivot :

SELECT *
FROM
(
SELECT joueur, rang
FROM Classement
WHERE rang <= 5
) src
PIVOT
(
MAX(joueur)
FOR rang IN (1, 2, 3, 4, 5)
) piv;

Infos
Gestion du forum

contact@geevey.com

API disponible. Utilisez le paramètre "api" en GET, peu importe le contenu, sur une page du site.

Notes

    Partenaire: JVFlux
    Ce site n'est pas associé à Jeuxvideo.com ou Webedia. Nous utilisons seulement des archives publiques.
    Il est inutile de me spammer par e-mail pour supprimer un topic. Au contraire, en conséquence, je mettrais votre topic dans le bloc ci-dessous.
Non-assumage
    Personne n'a pas assumé de topic pour le moment.