Vla t’y pas que j’ai une bete question à poser à des aguerris du SQL…
J’ai une table très simple (je l’ai vite fait à l’arrache pour l’exemple) :
CREATE TABLE `test` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(255) NOT NULL default ‘’,
`caractId` varchar(255) NOT NULL default ‘’,
UNIQUE KEY `id` (`id`)
) AUTO_INCREMENT=7 ;
Qui contient 6 beaux inserts :
INSERT INTO `test` VALUES (1, ‘hu’, ‘1’);
INSERT INTO `test` VALUES (2, ‘hu’, ‘2’);
INSERT INTO `test` VALUES (3, ‘hu’, ‘3’);
INSERT INTO `test` VALUES (4, ‘huhu’, ‘1’);
INSERT INTO `test` VALUES (5, ‘huhu’, ‘3’);
INSERT INTO `test` VALUES (6, ‘hu’, ‘5’);
J’aimerais sortir ‘name’ de tous les inserts qui ont comme caractId=‘1’ ET caractId=‘2’…
Alors évidemment ça foire car il check si pour UN même insert, il existe une caractId qui est égale à 1 et à 2… chose pas possible bien évidemment. Je veux qu’il check sur PLUSIEURS inserts…
Ché pas si vous me suivez… en tout cas ça dépasse mes compétences en la matière…
Si ya un "sqlien" qui a un peu de temps à perdre, je le remercie déjà grandement !
Bien à vous et vive Cluclu !
Oui au niveau du modèle de donnée, il n’est pas trop normalisé, il faudrait une première table où name est unique, et une deuxième table “d’association” pour les caractid.
Même avec ce modèle, tu peux feinter avec une auto-jointure (un IN marcherais aussi, mais est moins perf en général)
SQL
[color=blue;font-weight:bold]select[/color] t1.name from test t1, test t2 where t1.name=t2.name and t1.caractid='1' and t2.caractid='2';
ça se compilque si tu veux 3 ou 4 caractid, il vauxda mieux passer par un select count dans une requête imbriquée alors
SQL
[color=blue;font-weight:bold]select[/color] temp.name from (select name, count(*) as nb from test where caractid=1 or caractid=2 or caractid=4
group by name ) temp
where temp.nb=3;
ça commence un peu à faire requête de la mort qui tue