Page 1 sur 1

Requette avec plusieures clause where

Posté : 18 avr. 2007, 18:56
par aelurus
Bonjour tous

Je cherche a sélectionner tous les ID de ma tables article la ou l'appartenance est different de 1 2 3 4 ou 5

Code : Tout sélectionner

SELECT `id_article` FROM `article` WHERE `appartenance` != 0 OR 1 OR 2 OR 3 OR 4 OR 5 ORDER BY `id_article` ASC
le resultat retourner ne correspond pas a mon attente ??
Je pense que je fait une erreure de syntaxe j'ai aussi essayé '&' mais sans plus de résultat, dois je faire une requette par chiffre a tester ?

Posté : 18 avr. 2007, 19:17
par aelurus
MEA CULPA :)

Code : Tout sélectionner

SELECT `id_article` FROM `article` WHERE `appartenance` NOT IN (0,1,2,3,4,5)
Si je peux me permettre une autre question ^^

(0,1,2,3,4,5) sont les les valeurs d'une autre table ( menu champs id_menu) puis je faire une requette unique qui me remplisse ces valeurs toutes seules ou dois je construire ma requette via php ?

Posté : 18 avr. 2007, 23:40
par jed
Pour que ce soit le plus pratique possible tu devrais faire des tables en innodb avec une clé étrangère qui serait l'id de ton autre table. ;)

Posté : 19 avr. 2007, 07:54
par Cyrano
Pour que ce soit le plus pratique possible tu devrais faire des tables en innodb avec une clé étrangère qui serait l'id de ton autre table. ;)
Tu pourrais parfaitement créer des tables avec des clés étrangères de type MyISAM : ce que le type InnoDB va apporter en plus, c'est la possibilité d'ajouter des contraintes d'intégrité référentielle. Avec des tables MyISAM, tu devrais simplement gérer cette intégrité par programmation.

Posté : 19 avr. 2007, 15:26
par aelurus
Ba j'en apprend je ne connaissais pas l'éxistance de different type de table....

Code : Tout sélectionner

-- Structure de la table `article` -- CREATE TABLE `article` ( `id_article` int(25) NOT NULL auto_increment, `auteur` int(9) NOT NULL, `date` date NOT NULL, `texte` text NOT NULL, `titre` varchar(30) NOT NULL, `date_maj` date NOT NULL, `appartenance` int(9) NOT NULL, `ordre` int(5) NOT NULL, PRIMARY KEY (`id_article`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=43 ;

Code : Tout sélectionner

-- Structure de la table `menu` -- CREATE TABLE `menu` ( `id_menu` tinyint(2) NOT NULL auto_increment, `parent` smallint(3) NOT NULL, `titre` text character set latin1 collate latin1_general_ci NOT NULL, `ordre` tinyint(2) NOT NULL, KEY `id_menu_2` (`id_menu`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
Voici mes deux structure de table, elles sont toutes les deux dans le format Myisam.
Je me rencarde sur comment marche la programmation en sql.
Je cherche en fait a trouver les articles orphelin dans ma table article c'est a dire a comparer les appartenance de mes articles avec le champ id_menu de ma table menu.
Si 'appartenance' n'éxiste pas dans 'id_menu' mon articles est orphelin.
Voici ma logique de dépard plus qu'a trouver si je peux la mettre directement dans ma requette sql ou si je dois faire un pré traitement en php en amont ....

Posté : 19 avr. 2007, 15:46
par aelurus
Powa

Code : Tout sélectionner

SELECT titre FROM `article` WHERE `appartenance` NOT IN (select id_menu from menu)
Tout bêtement pourquoi faire compliqué quand on peut faire simple, voila une requête qui comble toutes mes attentes si vous avez des critiques ou suggestions je suis preneur .
En attendant le sujet est résolu pour moi :), je le dit ici vu que je ne trouve pas ou le faire apparaitre autrement .......
(TROUVE pour le résolu )

Posté : 19 avr. 2007, 15:49
par Cyrano
Lequel doit faire partie de l'autre ? menu appartient à article ou l'inverse.

Petit détail : lorsque tu crées une relation, tu ajoutes en clé étrangère dans la table fille une colonne avec le nom de la clé primaire de la table parente. Donc premier truc : on préfixe le nom des colonnes. Ainsi, la colonne id se nommera soit art_id soit men_id : si un article fait partie d'un menu, alors dans la table article, on trouvera la colonne art_id mais également men_id. Comme ça, tu peux faire des jointures facilement. (Voir dans la FAQ l'article sur les jointures basiques)

note importante, une clé étrangère devra également avoir le même type et les mêmes propriétés que la clé primaire qu'elle représente. Donc si la clé primaire est un INT UNSIGNED NOT NULL AUTO_INCRÉMENT, la clé étrangère dans l'autre table aura exactement les mêmes caractéristiques sauf bien entendu l'auto-incrément.

Pour rechercher maintenant des lignes orphelines, ça va un peu dépendre de la version de MySQL que tu utilises. Si elle est supérieure à la 4.1, alors utilise une sous-requête avec un NOT IN.

N'hésite pas à mettre ces mots-clés pour trouver des informations dans la doc de MySQL

Posté : 19 avr. 2007, 16:04
par jed
Tu pourrais parfaitement créer des tables avec des clés étrangères de type MyISAM : ce que le type InnoDB va apporter en plus, c'est la possibilité d'ajouter des contraintes d'intégrité référentielle. Avec des tables MyISAM, tu devrais simplement gérer cette intégrité par programmation.
Le moteur myisam n'est pas du tout prévu pour gérer des clés étrangères à l'origine et peut produire des erreurs, alors que le type innodb lui a été élaboré en partie ça.

Tu ferais mieux comme je préconise d'ajouter comme clé étrangère dans ta table "articles" la clé "id_menu" de la table "menu", comme ça le contenu de la clé étrangère "id_menu" sera vérifiée et indexée en permanence:

Code : Tout sélectionner

ALTER TABLE articles ADD CONSTRAINT FOREIGN KEY (menu_id) REFERENCES (menu) ON DELETE CASCADE

Posté : 19 avr. 2007, 16:52
par Hubert Roksor
Cyrano faisait la différence entre le concept de "clé étrangère" et l'intégrité référentielle proprement dite. InnoDB se propose de garantir l'intégrité référentielle de la table, mais tu peux aussi choisir de faire ce boulot toi-même (certes avec de bien moindres garanties, voire aucune).

Posté : 19 avr. 2007, 17:10
par jed
Ah ok j'avais pas saisi ça comme ça ;)

Posté : 19 avr. 2007, 17:50
par aelurus
Merci Cyrano

Ma table 'article' dépend bien de ma table 'menu', la clé étrangère est 'appartenance', je vais donc voir a corriger ce nom de champs par 'menu_id'. Maintenant j'ai plus qu'a trouver un traitement a cette requette :)

Encore un grand merci :)