IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Erreur de colonne dans une requête


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 131
    Points : 67
    Points
    67
    Par défaut Erreur de colonne dans une requête
    Bonjour à tous,

    J'essaye d'installer un serveur de jeu Trackmania Nations Forever avec le contrôleur Xaseco 1 sous ubuntu 16.04 lts server – php7 – mysql Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using EditLine wrapper

    J'ai une erreur relative à une requête sql et faute de réponse depuis plusieurs semaines dans les forums TM et Xaseco, je viens voir ici si je ne trouverais pas davantage d'assistance.

    Alors la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $order = ($aseco->server->gameinfo->mode == Gameinfo::STNT ? 'DESC' : 'ASC');
    $query = 'SELECT c.Id AS ChallengeId, r.Score, p.NickName, p.Login, r.Date, r.Checkpoints
                      FROM challenges c
                      LEFT JOIN records r ON (r.ChallengeId=c.Id)
                      LEFT JOIN players p ON (r.PlayerId=p.Id)
                      WHERE c.Uid=' . quotedString($challenge->uid) . '
                      GROUP BY r.Id
                      ORDER BY r.Score ' . $order . ',r.Date ASC
                      LIMIT ' . $ldb_records→max;
    $result = mysql_query($query);

    l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [XASECO Warning] Could not get challenge info! (Unknown column 'r.ChallengeId' in 'on clause')
    sql = SELECT c.Id AS ChallengeId, r.Score, p.NickName, p.Login, r.Date, r.Checkpoints
                      FROM challenges c
                      LEFT JOIN records r ON (r.ChallengeId=c.Id)
                      LEFT JOIN players p ON (r.PlayerId=p.Id)
                      WHERE c.Uid='fr_kgoDLmp56IJDiplemAJ3'
                      GROUP BY r.Id
                      ORDER BY r.Score ASC,r.Date ASC
                      LIMIT 50
    Côté db :

    la table challenges :

    Nom : tab_challenges.png
Affichages : 281
Taille : 17,5 Ko

    … qui dispose d'un enregistrement :

    Nom : mysqlXaseco.png
Affichages : 196
Taille : 7,4 Ko

    la table players vide :

    Nom : tab_players.png
Affichages : 193
Taille : 28,6 Ko

    … et la table records, vide aussi :

    Nom : tab_rec.png
Affichages : 304
Taille : 17,4 Ko

    Pourriez-vous m'aider à localiser la source du problème et à la corriger ?

    Merci de vos suggestions...

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    [EDIT] Ne pas tenir compte ... de ce post !

    Essayer ceci car nous n'avons pas les relations entre les tables !?

    r.ChallengeId <=> records.ChallengeId mais ChallengeId ne fait pas partie de la table records alors que le champ Id si ...
    donc r.Id existe et peut-être utilisé
    et
    p.PlayerId <=> players.PlayerId mais PlayerId ne fait pas partie de la table players alors que le champ Id si ...
    donc p.Id existe et peut-être utilisé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT c.Id AS ChallengeId, r.Score, p.NickName, p.Login, r.Date, r.Checkpoints
                      FROM challenges c
                      LEFT JOIN records r ON (r.Id=c.Id)
                      LEFT JOIN players p ON (r.Id=p.Id)
                      WHERE c.Uid='fr_kgoDLmp56IJDiplemAJ3'
                      GROUP BY r.Id
                      ORDER BY r.Score ASC,r.Date ASC
                      LIMIT 50
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par vttman Voir le message
    Essayer ceci car nous n'avons pas les relations entre les tables [...]
    Bonjour,

    Non, cette correction ne peut pas fonctionner, car l'identifiant challenge (C.id) ne peut correspondre ni à un identifiant de joueur (P.id) ni d'enregistrement (R.id)

    Ce qui ne va pas, c'est que, si la description de votre table challenge est complète, il manque des colonnes permettant de faire la jointure vers player d'une part et vers record d'autre part

    Communiquez nous le DDL complet de vos tables (ordres CREATE TABLE et ALTER TABLE) pour en avoir le cœur net

    EDIT : j'ajoute que votre GROUP BYest incohérent avec les colonnes de votre SELECT, seul MYSQL autorise cette entorse à la norme SQL, et le contenu des colonnes non groupées est aléatoire (l'une des valeurs possibles est restituée, selon le bon vouloir de MySQL). A vos risques et périls. Comme vous n'utilisez aucune fonction d'aggrégation (COUNT, MIN, AVERAGE, SUM...) un GROUP BY est inutile et contre-performant. Utilisez DISTINCTle cas échéant

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 131
    Points : 67
    Points
    67
    Par défaut
    Bonjour et merci de vos messages.

    Alors pour CREATE TABLE j'ai ceci dans un fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    // create main tables
            $query = "CREATE TABLE IF NOT EXISTS `challenges` (
                        `Id` mediumint(9) NOT NULL auto_increment,
                        `Uid` varchar(27) NOT NULL default '',
                        `Name` varchar(100) NOT NULL default '',
                        `Author` varchar(30) NOT NULL default '',
                        `Environment` varchar(10) NOT NULL default '',
                        PRIMARY KEY (`Id`),
                        UNIQUE KEY `Uid` (`Uid`)
                      ) ENGINE=MyISAM";
            mysql_query($query);
     
            $query = "CREATE TABLE IF NOT EXISTS `players` (
                        `Id` mediumint(9) NOT NULL auto_increment,
                        `Login` varchar(50) NOT NULL default '',
                        `Game` varchar(3) NOT NULL default '',
                        `NickName` varchar(100) NOT NULL default '',
                        `Nation` varchar(3) NOT NULL default '',
                        `UpdatedAt` datetime NOT NULL default '0000-00-00 00:00:00',
                        `Wins` mediumint(9) NOT NULL default 0,
                        `TimePlayed` int(10) unsigned NOT NULL default 0,
                        `TeamName` char(60) NOT NULL default '',
                        PRIMARY KEY (`Id`),
                        UNIQUE KEY `Login` (`Login`),
                        KEY `Game` (`Game`)
                      ) ENGINE=MyISAM";
            mysql_query($query);
     
            $query = "CREATE TABLE IF NOT EXISTS `records` (
                        `Id` int(11) NOT NULL auto_increment,
                        `ChallengeId` mediumint(9) NOT NULL default 0,
                        `PlayerId` mediumint(9) NOT NULL default 0,
                        `Score` int(11) NOT NULL default 0,
                        `Date` datetime NOT NULL default '0000-00-00 00:00:00',
                        `Checkpoints` text NOT NULL,
                        PRIMARY KEY (`Id`),
                        UNIQUE KEY `PlayerId` (`PlayerId`,`ChallengeId`),
                        KEY `ChallengeId` (`ChallengeId`)
                      ) ENGINE=MyISAM";
            mysql_query($query);
     
            $query = "CREATE TABLE IF NOT EXISTS `players_extra` (
                        `playerID` mediumint(9) NOT NULL default 0,
                        `cps` smallint(3) NOT NULL default -1,
                        `dedicps` smallint(3) NOT NULL default -1,
                        `donations` mediumint(9) NOT NULL default 0,
                        `style` varchar(20) NOT NULL default '',
                        `panels` varchar(255) NOT NULL default '',
                        PRIMARY KEY (`playerID`),
                        KEY `donations` (`donations`)
                      ) ENGINE=MyISAM";
            mysql_query($query);

    ... ceci dans un autre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE IF NOT EXISTS `players_extra` (
      `playerID` mediumint(9) NOT NULL default 0,
      `cps` smallint(3) NOT NULL default -1,
      `dedicps` smallint(3) NOT NULL default -1,
      `donations` mediumint(9) NOT NULL default 0,
      `style` varchar(20) NOT NULL default '',
      `panels` varchar(255) NOT NULL default '',
      PRIMARY KEY (`playerID`),
      KEY `donations` (`donations`)
    ) ENGINE=MyISAM;
    ... et pour ALTER TABLE ceci dans un fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    // enlarge challenges 'Name' colum
            $result = mysql_query('DESC challenges Name');
            $row = mysql_fetch_row($result);
            mysql_free_result($result);
            if ($row[1] != 'varchar(100)') {
                    $aseco->console("[LocalDB] Alter 'challenges' column 'Name'...");
                    mysql_query("ALTER TABLE challenges MODIFY Name varchar(100) NOT NULL default ''");
            }
     
            // reduce challenges 'Environment' colum
            $result = mysql_query('DESC challenges Environment');
            $row = mysql_fetch_row($result);
            mysql_free_result($result);
            if ($row[1] != 'varchar(10)') {
                    $aseco->console("[LocalDB] Alter 'challenges' column 'Environment'...");
                    mysql_query("ALTER TABLE challenges MODIFY Environment varchar(10) NOT NULL default ''");
            }
     
            // add players 'TeamName' column
            $fields = array();
            $result = mysql_query('SHOW COLUMNS FROM players');
            while ($row = mysql_fetch_row($result))
                    $fields[] = $row[0];
            mysql_free_result($result);
            if (!in_array('TeamName', $fields)) {
                    $aseco->console("[LocalDB] Add 'players' column 'TeamName'...");
                    mysql_query("ALTER TABLE players ADD TeamName char(60) NOT NULL default ''");
            }
     
            // enlarge players 'NickName' & 'TimePlayed' columns
            $result = mysql_query('DESC players NickName');
            $row = mysql_fetch_row($result);
            mysql_free_result($result);
            if ($row[1] != 'varchar(100)') {
                    $aseco->console("[LocalDB] Alter 'players' column 'NickName'...");
                    mysql_query("ALTER TABLE players MODIFY NickName varchar(100) NOT NULL default ''");
            }
            $result = mysql_query('DESC players TimePlayed');
            $row = mysql_fetch_row($result);
            mysql_free_result($result);
            if ($row[1] != 'int(10) unsigned') {
                    $aseco->console("[LocalDB] Alter 'players' column 'TimePlayed'...");
                    mysql_query("ALTER TABLE players MODIFY TimePlayed int(10) unsigned NOT NULL default 0");
            }
     
            // enlarge records 'Id' & 'Score' columns
            $result = mysql_query('DESC records Id');
            $row = mysql_fetch_row($result);
            mysql_free_result($result);
            if ($row[1] != 'int(11)') {
                    $aseco->console("[LocalDB] Alter 'records' column 'Id'...");
                    mysql_query('ALTER TABLE records MODIFY Id int(11) auto_increment');
            }
            $result = mysql_query('DESC records Score');
            $row = mysql_fetch_row($result);
            mysql_free_result($result);
            if ($row[1] != 'int(11)') {
                    $aseco->console("[LocalDB] Alter 'records' column 'Score'...");
                    mysql_query("ALTER TABLE records MODIFY Score int(11) NOT NULL default 0");
            }
     
            // add records 'Checkpoints' column
            $fields = array();
            $result = mysql_query('SHOW COLUMNS FROM records');
            while ($row = mysql_fetch_row($result))
                    $fields[] = $row[0];
            mysql_free_result($result);
            if (!in_array('Checkpoints', $fields)) {
                    $aseco->console("[LocalDB] Add 'records' column 'Checkpoints'...");
                    mysql_query("ALTER TABLE records ADD Checkpoints text NOT NULL");
            }
     
            // change records old 'ChallengeId' key into new 'PlayerId' key and
            //  add records new 'ChallengeId' key
            $fields = array('PlayerId' => 0, 'ChallengeId' => 0);
            $result = mysql_query('SHOW INDEX FROM records');
            while ($row = mysql_fetch_row($result)) {
                    if (isset($fields[$row[2]]))
                            $fields[$row[2]]++;
            }
            mysql_free_result($result);
            if ($fields['ChallengeId'] == 2 && $fields['PlayerId'] == 0) {
                    $aseco->console("[LocalDB] Drop 'records' key 'ChallengeId'...");
                    mysql_query("ALTER TABLE records DROP KEY ChallengeId");
                    $aseco->console("[LocalDB] Add 'records' key 'PlayerId'...");
                    mysql_query("ALTER TABLE records ADD UNIQUE KEY PlayerId (PlayerId, ChallengeId)");
                    $aseco->console("[LocalDB] Add 'records' key 'ChallengeId'...");
                    mysql_query("ALTER TABLE records ADD KEY ChallengeId (ChallengeId)");
            }
    ... ceci dans un second mêlant CREATE et ALTER :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    function checkTables() {
     
                    // create rs_* tables if needed
                    $query = 'CREATE TABLE IF NOT EXISTS `rs_karma` (
                               `Id` int(11) NOT NULL auto_increment,
                               `ChallengeId` mediumint(9) NOT NULL default 0,
                               `PlayerId` mediumint(9) NOT NULL default 0,
                               `Score` tinyint(4) NOT NULL default 0,
                               PRIMARY KEY (`Id`),
                               UNIQUE KEY `PlayerId` (`PlayerId`,`ChallengeId`),
                               KEY `ChallengeId` (`ChallengeId`)
                             ) ENGINE=MyISAM';
                    mysql_query($query);
     
                    $query = 'CREATE TABLE IF NOT EXISTS `rs_rank` (
                               `playerID` mediumint(9) NOT NULL default 0,
                               `avg` float NOT NULL default 0,
                               KEY `playerID` (`playerID`)
                             ) ENGINE=MyISAM';
                    mysql_query($query);
     
                    $query = 'CREATE TABLE IF NOT EXISTS `rs_times` (
                               `ID` int(11) NOT NULL auto_increment,
                               `challengeID` mediumint(9) NOT NULL default 0,
                               `playerID` mediumint(9) NOT NULL default 0,
                               `score` int(11) NOT NULL default 0,
                               `date` int(10) unsigned NOT NULL default 0,
                               `checkpoints` text NOT NULL,
                               PRIMARY KEY (`ID`),
                               KEY `playerID` (`playerID`,`challengeID`),
                               KEY `challengeID` (`challengeID`)
                             ) ENGINE=MyISAM';
                    mysql_query($query);
     
                    // check for rs_* tables
                    $tables = array();
                    $res = mysql_query('SHOW TABLES');
                    while ($row = mysql_fetch_row($res))
                            $tables[] = $row[0];
                    mysql_free_result($res);
                    $check = array();
                    $check[1] = in_array('rs_rank', $tables);
                    $check[2] = in_array('rs_times', $tables);
                    $check[3] = in_array('rs_karma', $tables);
                   // get list of rs_times columns
                    $fields = array();
                    $res = mysql_query('SHOW COLUMNS FROM rs_times');
                    while ($row = mysql_fetch_row($res))
                            $fields[] = $row[0];
                    mysql_free_result($res);
     
                    // rename column 'trackID' (v0.7) to 'challengeID' (v0.8+) if not yet done
                    if (in_array('trackID', $fields)) {
                            $this->aseco->console("[RASP] Rename 'rs_times' column 'trackID'...");
                            mysql_query('ALTER TABLE rs_times CHANGE trackID challengeID mediumint(9) NOT NULL default 0');
                    }
                    // add rs_times 'checkpoints' column
                    if (!in_array('checkpoints', $fields)) {
                            $this->aseco->console("[RASP] Add 'rs_times' column 'trackID'...");
                            mysql_query('ALTER TABLE rs_times ADD checkpoints text NOT NULL');
                    }
     
                    // enlarge rs_times 'ID' & 'score' columns
                    $res = mysql_query('DESC rs_times ID');
                    $row = mysql_fetch_row($res);
                    mysql_free_result($res);
                    if ($row[1] != 'int(11)') {
                            $this->aseco->console("[RASP] Alter 'rs_times' column 'ID'...");
                            mysql_query('ALTER TABLE rs_times MODIFY ID int(11) auto_increment');
                    }
                    $res = mysql_query('DESC rs_times score');
                    $row = mysql_fetch_row($res);
                    mysql_free_result($res);
                    if ($row[1] != 'int(11)') {
                            $this->aseco->console("[RASP] Alter 'rs_times' column 'score'...");
                            mysql_query('ALTER TABLE rs_times MODIFY score int(11) NOT NULL default 0');
                    }
     
                    // change rs_times old 'rs_times_player_track' key into new 'playerID' key
                    //  and add rs_times new 'ChallengeId' key
                    $fields = array('rs_times_player_track' => 0, 'challengeID' => 0);
                    $result = mysql_query('SHOW INDEX FROM rs_times');
                    while ($row = mysql_fetch_row($result)) {
                            if (isset($fields[$row[2]]))
                                    $fields[$row[2]]++;
     
                    mysql_free_result($result);
                    if ($fields['rs_times_player_track'] == 2 && $fields['challengeID'] == 0) {
                            $this->aseco->console("[RASP] Drop 'rs_times' key 'rs_times_player_track'...");
                            mysql_query("ALTER TABLE rs_times DROP KEY rs_times_player_track");
                            $this->aseco->console("[RASP] Add 'rs_times' key 'playerID'...");
                            mysql_query("ALTER TABLE rs_times ADD KEY playerID (playerID, challengeID)");
                            $this->aseco->console("[RASP] Add 'rs_times' key 'challengeID'...");
                            mysql_query("ALTER TABLE rs_times ADD KEY challengeID (challengeID)");
                    }
     
                    // reduce rs_karma 'Score' column
                    $res = mysql_query('DESC rs_karma Score');
                    $row = mysql_fetch_row($res);
                    mysql_free_result($res);
                    if ($row[1] != 'tinyint(4)') {
                            $this->aseco->console("[RASP] Alter 'rs_karma' column 'score'...");
                            mysql_query('ALTER TABLE rs_karma MODIFY Score tinyint(4) NOT NULL default 0');
                    }
     
                    return ($check[1] && $check[2] && $check[3]);
            }  // checkTables
    ... et ceci dans un dernier mêlant aussi CREATE et ALTER :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    function checkTables() {
     
            $query = 'CREATE TABLE IF NOT EXISTS `match_main` (
                                                            `ID` mediumint(9) NOT NULL auto_increment,
                                                            `trackID` mediumint(9) NOT NULL default 0,
                                                            `dttmrun` timestamp NOT NULL default Now(),
                                                            PRIMARY KEY     (`ID`)
                                                    ) ENGINE=MyISAM';
            mysql_query($query);
     
            $query = 'CREATE TABLE IF NOT EXISTS `match_details` (
                                                            `matchID` mediumint(9) NOT NULL,
                                                            `playerID` mediumint(9) NOT NULL default 0,
                                                            `teamname` varchar(40),
                                                            `points` tinyint default 0,
                                                            `score` mediumint(9),
                                                            PRIMARY KEY (`matchID`,`playerID`)
                                                    ) ENGINE=MyISAM';
            mysql_query($query);
     
            $tables = array();
            $res = mysql_query('SHOW TABLES');
            while ($row = mysql_fetch_row($res))
                    $tables[] = $row[0];
            mysql_free_result($res);
     
            $check = array();
            $check[1] = in_array('match_main', $tables);
            $check[2] = in_array('match_details', $tables);
     
            // add 'teamname' column if not yet done
            $res = mysql_query('SELECT teamname FROM players limit 1');
            if ($res == false) {
                    if (mysql_errno() == 1054) {
                            mysql_query('ALTER TABLE players ADD TeamName char(60)');
                    }
            } else {
                    mysql_free_result($res);
            }
     
            return ($check[1] && $check[2]);
    }  // checkTables

    Ce qui ne va pas, c'est que, si la description de votre table challenge est complète, il manque des colonnes permettant de faire la jointure vers player d'une part et vers record d'autre part
    Peut-être une erreur de ma part dans l'installation du contrôleur Xaseco, je vais revérifier le process d'installation de ce contrôleur qui, il faut l'avouer, n'est pas très clair, et voir si je n'aurais pas omis une étape relative précisément à l'ajout de ces colonnes...

    En tous cas merci de cette piste...

    EDIT: j'ai retrouvé d'autres CREATE et ALTER ailleurs, j'ai donc complété ce post

  5. #5
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Bonjour,

    Non, cette correction ne peut pas fonctionner, car l'identifiant challenge (C.id) ne peut correspondre ni à un identifiant de joueur (P.id) ni d'enregistrement (R.id)

    ...
    Oui effectivement à la relecture ... je me suis emballé et
    j'ai proposé au final n'importe quoi !
    Heureusement qu'il y en a qui veille !? ça doit être la proximité des fêtes
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 131
    Points : 67
    Points
    67
    Par défaut
    @vttman: merci tout de même de vous être penché sur la question...

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    @Adgenodux : la lecture du script confirme mes soupçons, il manque les colonnes de jointures et les contraintes de type "REFERENCE" permettant de garantir l'intégrité de la base
    Le DDL des tables de votre requête, en l'occurrence PLAYERS, CHALLENGES et RECORDS suffisait

    @vttman : bah ça arrive

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 131
    Points : 67
    Points
    67
    Par défaut
    mince, voilà qui est fâcheux et surprenant dans la mesure où ce n'est pas un contrôleur récent et qu'il tourne manifestement sur de nombreux serveurs, étant quasi le dernier encore utilisable aujourd'hui...

    Il doit bien être possible de créer les colonnes manquantes non ?

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    Quelles sont les relations entre ces tables, les cardinalités

    Si on revient au MCD, auriez vous modélisé par exemple :
    PLAYER 0,n --- Challenge --- 0,n RECORD

    Ou bien
    PLAYER 0,n --- Record --- 0,n CHALLENGE

    Ou bien ...

    EDIT(1) : désolé j'avais mal vu, je viens de trouver les colonnes de jointure , par contre il manque effectivement les contraintes de type REFERENCE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
           `records` (`Id`          int(11)      NOT NULL auto_increment,
                      `ChallengeId` mediumint(9) NOT NULL default 0,
                      `PlayerId`    mediumint(9) NOT NULL default 0,
                      `Score`       int(11)      NOT NULL default 0,
                      `Date`        datetime     NOT NULL default '0000-00-00 00:00:00',
                      `Checkpoints` text         NOT NULL,
                      PRIMARY KEY (`Id`),  
                      UNIQUE KEY `PlayerId` (`PlayerId`,`ChallengeId`),
                      KEY `ChallengeId` (`ChallengeId`)
                     )
    EDIT(2) : du coup, êtes vous certains que c'est bien ce script qui est appliqué sur votre instance de base de données, pouvez vous vérifier la présence effective des colonnes `ChallengeId` et `PlayerId` dans la table RECORD

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 131
    Points : 67
    Points
    67
    Par défaut
    alors la colonne "PlayerId" se trouve bien dans la table (visible d'ailleurs sur un des screenshots de mon premier post) alors que, confirmant donc la nature de l'erreur, la colonne ChallengeId quant à elle ne se trouve pas dans la table...

    suffirait-il simplement de l'y ajouter pour résoudre tout ?

  11. #11
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Pourtant le champ ChallengeId devrait être là ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE IF NOT EXISTS `records` (
                        `Id` int(11) NOT NULL auto_increment,
                        `ChallengeId` mediumint(9) NOT NULL default 0,
                        `PlayerId` mediumint(9) NOT NULL default 0,
                        `Score` int(11) NOT NULL default 0,
                        `Date` datetime NOT NULL default '0000-00-00 00:00:00',
                        `Checkpoints` text NOT NULL,
                        PRIMARY KEY (`Id`),
                        UNIQUE KEY `PlayerId` (`PlayerId`,`ChallengeId`),
                        KEY `ChallengeId` (`ChallengeId`)
                      ) ENGINE=MyISAM;
    Donc s'il n'est pas là c'est que la table records existait déjà et que cet ordre SQL "create" n'a pas été exécuté ...
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 131
    Points : 67
    Points
    67
    Par défaut
    donc est-ce que quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE records ADD COLUMN ChallengeId mediumint(9) NOT NULL default 0;
    ... ne résoudrait pas le problème ?

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 131
    Points : 67
    Points
    67
    Par défaut
    CA MAAAAARCHE

    J'ai carrément viré puis recréé toutes les tables utiles selon les codes trouvés dans des fichiers fournis avec Xaseco et ça marche enfin...

    Votre aide aura été déterminante car ça bloquait depuis des semaines et les indications de ce fil m'ont permis de trouver les erreurs dans la db et les corriger...

    problème donc résolu, un grand merci à vous

  14. #14
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    Et bien tant mieux

    Du coup vous devriez en profiter pour ajouter les contraintes REFERENCE, voici un exemple de script incluant ce type de contrainte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    CREATE TABLE IF NOT EXISTS 
           `records` (`Id`          int(11)      NOT NULL auto_increment,
                      `ChallengeId` mediumint(9) NOT NULL default 0,
                      `PlayerId`    mediumint(9) NOT NULL default 0,
                      `Score`       int(11)      NOT NULL default 0,
                      `Date`        datetime     NOT NULL default '0000-00-00 00:00:00',
                      `Checkpoints` text         NOT NULL,
                      PRIMARY KEY (`Id`),  
                      UNIQUE  KEY `PlayerId` (`PlayerId`,`ChallengeId`),
                      KEY         `ChallengeId` (`ChallengeId`)
                      CONSTRAINT `fk1_challengid` 
                                  FOREIGN KEY (`ChallengeId`)
                                  REFERENCES   `Challenge` (`id`)
                                  ON UPDATE CASCADE
                                  ON DELETE CASCADE
                      CONSTRAINT `fk2_playerid` 
                                  FOREIGN KEY (`PlayerId`)
                                  REFERENCES   `Players` (`id`)
                                  ON UPDATE CASCADE
                                  ON DELETE CASCADE
                     )
    Les contraintes de type REFERENCE garantissent l'intégrité de votre BDD, en l'absence, rien n'interdit par exemple d'insérer dans RECORDS des ChallengeId ou PlayerID sans correspondance dans CHALLENGE ou dans PLAYER, ou de conserver des id qui n'existent plus dans ces tables.
    Attention aux options choisies sur les instructions ON UPDATE et ON DELETE : CASCADE propage l'action sur la colonne de la table mère vers la colonne de la table fille, d'autres options sont possibles (SET NULL par exemple, souvent utilisé avec ON DELETE pour éviter les delete en masse) ==> se référer à la doc de référence pour plus de détails sur ces options.

    IL est fort possible, et même probable, que l'activation de ces contraintes provoque des rejets liés à des incohérences dans vos tables : faute de contraintes vous avez sans doute laissé passé des FK invalides. Vous pourrez exécuter facilement des requetes de diagnostic (par exemple en utilisant NOT EXISTS) avant de poser ces contraintes, pour faire le ménage et éviter les rejets

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 131
    Points : 67
    Points
    67
    Par défaut
    diantre... ça devient technique...

    cela dit pour les infos et pas de soucis pour la db car c'est une installation prototype, il n'y a que des données test, je peux tout flinguer, j'ai d'ailleurs déjà vidé les tables quelques fois

    maintenant faut que je vois ce que sont ces fameuses contraintes dont je n'ai naturellement jamais entendu parler

    peut-être en toucher un mot à celui qui a fait Xaseco...

  16. #16
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par adgenodux Voir le message
    maintenant faut que je vois ce que sont ces fameuses contraintes dont je n'ai naturellement jamais entendu parler
    C'est probablement l'un des points les plus importants de toute base de données !
    Des données dont l'intégrité n'est pas garantie n'ont qu'un intérêt .... très relatif

    Soyez certain que aucun contrôle par traitement n'atteint le niveau de fiabilité (et très loin s'en faut) des contrôles propres à la base de données, c'est la raison pour laquelle, l'implémentation des contraintes est un point crucial et très sensible. Comme vous avez choisi, et vous avez bien fait , des identifiants primaires non fonctionnels, vous pourrez mettre en oeuvre ces fameuses contraintes de façon optimale

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 131
    Points : 67
    Points
    67
    Par défaut
    Merci pour ces précieuses recommandations dont je prends bonne note et que je vais étudier de beaucoup plus près...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Opération en colonne dans une requête
    Par mooh91 dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 10/02/2007, 06h07
  2. Erreur de syntaxe dans une requête SQL
    Par amnesias dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/01/2007, 13h50
  3. Réponses: 6
    Dernier message: 29/11/2005, 20h36
  4. fusion de 2 colonnes dans une requête select?
    Par epeichette dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/11/2005, 00h05
  5. Erreur d'agrégation dans une requête UNION
    Par soso78 dans le forum Access
    Réponses: 2
    Dernier message: 05/10/2005, 01h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo