Requette avec plusieures clause where

Eléphant du PHP | 177 Messages

18 avr. 2007, 18:56

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 ?

Eléphant du PHP | 177 Messages

18 avr. 2007, 19:17

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 ?

jed
Eléphant du PHP | 218 Messages

18 avr. 2007, 23:40

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. ;)

Mammouth du PHP | 19672 Messages

19 avr. 2007, 07:54

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 177 Messages

19 avr. 2007, 15:26

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 ....

Eléphant du PHP | 177 Messages

19 avr. 2007, 15:46

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 )

Mammouth du PHP | 19672 Messages

19 avr. 2007, 15:49

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
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

jed
Eléphant du PHP | 218 Messages

19 avr. 2007, 16:04

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

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

19 avr. 2007, 16:52

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).

jed
Eléphant du PHP | 218 Messages

19 avr. 2007, 17:10

Ah ok j'avais pas saisi ça comme ça ;)

Eléphant du PHP | 177 Messages

19 avr. 2007, 17:50

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 :)