[mysql] Chercher une ligne, si elle existe pas on prend une autre

Eléphanteau du PHP | 47 Messages

19 avr. 2009, 18:15

Bonjour,

Je suit en train de développer un système pour gérer différent thème.

Je cherche donc toutes les informations qui sont dans la base de donnée à propos du thème choisi.
Cependant si mysql ne trouve rien je voudrais qu'il aille récupérer à la place le thème par défaut.

J'ai donc fait fait ces deux requettes :

Code : Tout sélectionner

SELECT * FROM tuks_theme WHERE id = **thème de l'utilisateur**
Et si cette première requette revoir rien je fait

Code : Tout sélectionner

SELECT * FROM tuks_theme WHERE id = **thème par défaut***
Structure de la base de donnée :

Code : Tout sélectionner

-- -- Structure de la table `tuks_theme` -- CREATE TABLE IF NOT EXISTS `tuks_theme` ( `id` tinyint(3) unsigned NOT NULL auto_increment, `nom` varchar(20) NOT NULL, `repertoire` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; -- -- Contenu de la table `tuks_theme` -- INSERT INTO `tuks_theme` (`id`, `nom`, `repertoire`) VALUES (1, 'Tuks Alpha 0.0.3', 'Tuks_0.0.3');
Cependant je voudrais faire tenir ça en une seul requête SQL.


Je sais que je doit pas mettre de code PHP mais je le met pour clarifiée l'utilisation
$this->mysql_requete_sql('SELECT * FROM tuks_theme WHERE id = \''.$this->utilisateur('theme').'\'', 'information_utilisation_theme', FALSE, TRUE);
		$this->donnee_theme_utilisateur = $this->mysql_associatif_resultat('information_utilisation_theme', TRUE);
		$this->mysql_liberer_resultat('information_utilisation_theme', TRUE);
		// Si le thème existe pas on prend celui par défaut
		if ( empty($this->donnee_theme_utilisateur['id']) )
		{
			$this->mysql_requete_sql('SELECT * FROM tuks_theme WHERE id = \''.THEME_DEFAUT.'\'', 'information_utilisation_theme_defaut', FALSE, TRUE);
			$this->donnee_theme_utilisateur = $this->mysql_associatif_resultat('information_utilisation_theme_defaut', TRUE);
			$this->mysql_liberer_resultat('information_utilisation_theme_defaut', TRUE);
			$this->erreur_theme_inexistant($this->utilisateur('theme'));
		}
Merci d'avance

ViPHP
ViPHP | 3607 Messages

19 avr. 2009, 19:07

Peut-être avec quelque chose comme ça....:

Code : Tout sélectionner

SELECT * FROM tuks_theme WHERE id = **thème de l'utilisateur** OR id= **thème par défaut** LIMIT 1
Après je ne sais pas comment mysql gère la condition en "ou", si il cherche d'abord la première partie, ou si e premier enregistrement qui rempli l'une ou l'autre condition est retenu...
Dans le cas de la deuxième hypothèse, il te faudra rajouter un "ordre" à ta table afin que le thème par défaut soit le premier (ou le dernier) et tu rajoutes un ORDER BY à ta requête et ça devrait le faire je pense...
à tester ;)

Eléphanteau du PHP | 47 Messages

19 avr. 2009, 19:17

Ce qui donnerais ce code là :

Code : Tout sélectionner

SELECT * FROM tuks_theme WHERE id = **thème de l'utilisateur** OR id= **thème par défaut** ORDER BY id DESC LIMIT 1
Celà fonctionne très bien cependant ça me parait quand même du bricolage, mais je pense que c'est aussi la façon la plus rapide.

Moi je cherchait du côter de IF EXIST mais j'ai trouver trop peu d'information sur cette "fonction" (je sais pas quel mot on utilise pour désigner de genre de choses).


Merci à toi

Mammouth du PHP | 693 Messages

19 avr. 2009, 19:20

PLutot qu'utiliser un OR, assez gourmand, c'est (légèrement) mieux d'utiliser IN

Code : Tout sélectionner

SELECT * FROM tuks_theme WHERE id IN( **thème de l'utilisateur** , **thème par défaut**) ORDER BY id DESC LIMIT 1
Mais bon, c'est vrai que c'est du chipotage.

Eléphanteau du PHP | 47 Messages

19 avr. 2009, 19:23

Merci à toi orgerix parce que je suis en mode chipotage en ce moment :lol:

Donc cette méthode est la plus rapide ?


Faudrais que j'aille m'acheter un bouquin sur mysql parce que sinon dans pas longtemps je serais chauve :lol: