8791 sujets

Développement web côté serveur, CMS

Bonjour à tous. Voici mon problème :

J'ai deux tables : une table 'jeux' et une table 'personnages'. La table 'personnages' contient un champ 'persos_jeux' listant les id des jeux dans lesquels le personnage apparait, séparés par des espaces.

Sur la page d'un jeu, je souhaite afficher les personnages qui y apparaissent. Pour cela, je compare l'id du jeu avec l'ensemble des champs 'persos_jeux' de l'ensemble des personnages, ce que je fais avec LIKE :

mysql_query("SELECT * FROM personnages WHERE persos_jeux LIKE \"%$id_jeu%\"");


Le problème, c'est qu'en admettant que l'id recherché soit 35, il va aussi me sélectionner les 135, 356, etc...

Connaissez vous une solution pour rechercher plus efficacement une valeur exacte dans un champ sql ?

Merci beaucoup Smiley smile
Modifié par maGriffe (15 Dec 2011 - 12:41)
Merci pour ta réponse. Malheureusement ça ne me donne aucun résultat alors que devrais en avoir quelques uns.

En imaginant que je recherche l'id '81', il devrait me le trouver dans un champ 'persos_jeux' comprenant plusieurs id ? '81 82 84 146 730 801 1351'

mysql_query("SELECT * FROM characters WHERE character_games = \"%81%\"");

Parce que là je n'ai aucun résultat et je ne comprends pas pourquoi...
Tu veux pas apprendre les bases de MySQL/SQL avant de te lancer dans le développement ? Parce que là c'est vraiment du grand n'importe quoi...
Heu on se calme... J'ai quelques sites web à mon bagage et les bases je les connais.
Je rencontre un problème que je n'ai jamais rencontré auparavant et je demande simplement à la communauté de m'aider.

Es-tu sûr d'avoir bien compris ce que je cherche à faire ?
Je reformule ma question puisqu'a priori elle n'était pas assez claire.

Ma table 'personnages' comprend plusieurs champs (par exemple 'id', 'description', etc...). Un de ces champs, c'est 'perso_jeux' dans lequel je liste les id des jeux dans lesquels le personnage apparaît.

Je souhaite sélectionner les personnages dans lesquels l'id du jeu cherché se trouve (parmi d'autres) dans le champ 'persos_jeux'.

Par exemple, je cherche l'id '81'.
Je souhaite trouver tous les personnages dont le champ 'persos_jeux' comprend la valeur 81.

Ca, ça ne suffit pas puisqu'il y a plusieurs valeurs dans le champ persos_jeux :
mysql_query("SELECT * FROM personnages WHERE persos_jeux = '81'")


Et ça, ce n'est pas assez précis :
mysql_query("SELECT * FROM personnages WHERE persos_jeux LIKE \"%81%\"")


Je souhaite donc savoir s'il existe une requête plus précise.
Salut, puisque des "id" sont séparés par des espaces, fais juste :

mysql_query("SELECT * FROM personnages WHERE persos_jeux LIKE '% 81 %'");

c'est à dire prends en compte les espaces dans ton "WHERE xxx LIKE"...

Tiens moi au jus, mais ça devrait le faire.
Modifié par skap64 (15 Dec 2011 - 10:13)
Salut, merci pour ta réponse Smiley smile

C'est vrai que dans l'idée c'est pas bête, mais tous les persos ne s'affichent pas. Sur un jeu en particulier, je n'ai que 2 persos qui s'affichent alors qu'au moins 6 ou 7 sont liés dans la bdd.

Voilà la vraie requête :

mysql_query("SELECT * FROM characters WHERE character_games LIKE '% $game_id %'");


Est-ce que c'est bien cette syntaxe que tu me conseilles ?
Voilà :


CREATE TABLE IF NOT EXISTS `characters` (
  `character_id` int(11) NOT NULL auto_increment,
  `character_gender` text NOT NULL,
  `character_classification` text NOT NULL,
  `character_year` text NOT NULL,
  `character_role` text NOT NULL,
  `character_origin` text NOT NULL,
  `character_alignment` text NOT NULL,
  `character_spec` text NOT NULL,
  `character_name` varchar(255) NOT NULL,
  `character_ordername` varchar(255) NOT NULL,
  `character_description_fr` text NOT NULL,
  `character_description_en` text NOT NULL,
  `character_youtube` varchar(255) NOT NULL,
  `character_series` text NOT NULL,
  `character_games` text NOT NULL,
  `character_quote` text NOT NULL,
  `character_score` float(11,1) NOT NULL default '0.0',
  `character_votes` int(11) NOT NULL default '0',
  PRIMARY KEY  (`character_id`),
  KEY `character_score` (`character_score`),
  KEY `character_votes` (`character_votes`),
  KEY `character_ordertitle` (`character_ordername`),
  FULLTEXT KEY `character_title` (`character_name`),
  FULLTEXT KEY `character_description_fr` (`character_description_fr`),
  FULLTEXT KEY `character_description_en` (`character_description_en`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5827 ;

--
-- Contenu de la table `characters`
--

INSERT INTO `characters` (`character_id`, `character_gender`, `character_classification`, `character_year`, `character_role`, `character_origin`, `character_alignment`, `character_spec`, `character_name`, `character_ordername`, `character_description_fr`, `character_description_en`, `character_youtube`, `character_series`, `character_games`, `character_quote`, `character_score`, `character_votes`) VALUES
(27, 'char_gender_male', 'char_classification_human_like', '1987', 'char_role_protagonist', 'char_origin_gaming', 'char_alignment_good', 'char_spec_playable', 'Solid Snake', 'Solid Snake', ' ', ' ', 'http://www.youtube.com/watch?v=c3ETCsZAss0', '', '81 82 84 146 730 801 1351 1458 2167 2543 3595 4081 4384', '', 0.0, 0);


Donc là le personnage c'est Solid Snake, il doit apparaître dans le jeu "Metal Gear Solid" dont l'id est 81. Mais avec la solution que tu m'as proposé ce n'est pas le cas.
Modifié par maGriffe (15 Dec 2011 - 11:25)
ok je vois , le premier et dernier n'ont pas d'espace avant et apres respectiement...
execute cette requete :

UPDATE characters SET character_games = '81;82;84;146;730;801;1351;1458;2167;2543;3595;4081;4384;' WHERE character_id = '27'

Ensuite dans ton programme, si tu ajoutes ou modifies le champs "character_games" de la table "characters", fais toujours suivre le nouvel identifiant par ";";
Ainsi tu peux récupérer ce que tu veux par :

mysql_query("SELECT * FROM characters WHERE character_games LIKE '$game_id;'");
Je viens d'essayer et mon Solid Snake ne s'affiche pas, sauf si j'ajoute les %.

mysql_query("SELECT * FROM characters WHERE character_games LIKE '%$game_id;%'");


C'était un oubli de ta part ou est-ce que les % affecteront la précision des résultats ?

Si c'est ok, il me reste qu'à te remercier merci de ton aide. Plus qu'à trouver comment mettre les champs à jour avec les ; (la bdd est assez conséquente). Mais ça je vais essayer de m'en charger tout seul Smiley smile
pour modifier ta table :


<?php
$q = mysql_query("SELECT character_id, character_games FROM characters");
$i = 0;
while($r = mysql_fetch_row($q))
{
	$remplace = str_replace(" ",";",$r[1]);
	if(mysql_query("UPDATE characters SET character_games = '$remplace' WHERE character_id = '$r[0]'"))
	$i++;
}
echo "$i lignes modifi&eacute;es!!!";
?>
Hé hé merci j'ai réussi tout seul ça Smiley smile

Du coup j'ai tout mis à jour mais sans les % ca ne m'affiche rien, et avec ça m'affiche des persos qui n'ont aucun raporrt avec le jeu.

Mais je crois savoir pourquoi : par exemple, Mario s'affiche dans la liste des persos de Metal Gear, dont l'id est 81. Mais Mario est attaché à un jeu dont l'id est 3381. Donc il rentre dans le '%81;%'

Du coup je vais essayer en entourant les id de quotes pour que ca donne '81', ça devrait marcher non ?

Je te tiens au courant !
en effet ta chaine doit commencer par ";" mille excuses donc style : ;24;66;3881;
et là ce sera bon...
Smiley cligne
J'ai mis chaque id entre parenthèses et ça m'a l'air de fonctionner plutôt bien avec cette requête :
mysql_query("SELECT * FROM characters WHERE character_games LIKE '%($game_id)%'")


Merci beaucoup pour ton aide !

[Edit] Et un poke @jb_gfx qui a dû se lever du mauvais pied ce matin. Sans rancune. [/Edit]
Modifié par maGriffe (15 Dec 2011 - 12:42)