Forum Clubic

MySQL - query à la noix

Bien le bonjour mesdames et messieurs,

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 !

SQL
[color=blue;font-weight:bold]SELECT[/color] `name` FROM test WHERE `caractId`=1 OR `caractId`=2

J’ai pas top saisi ton problème, là…

Dans l’absolu, caractId est une chaîne, donc :

SQL
[color=blue;font-weight:bold]SELECT[/color] `name` FROM test WHERE `caractId`='1' OR `caractId`='2'

Ca n’empêche que je n’ai pas très bien compris son histoire de “check” à l’insertion…

héhéhhéhé c’est gentil mais il faut que les deux conditions soient satisfaites…

Ah.

C’est légèrement impossible, mais bref…

  1. caracId devrait être de type UNSIGNED INT (je pense)
  2. tu devrais passer par une table à deux champs (id, caracId) qui te permettrait de stocker autant de relation avec les caractId.

Ensuite, tu pourras utiliser des requêtes plus avancées (IN, EXISTS, etc)

Merci, merci pour vos réponses !

1. caracId devrait être de type UNSIGNED INT (je pense)

Je sais , je sais c’était pour l’exemple…

je vois bien un truc en unissant mais comme je dois faire des tests sur plusieurs caractId ça a tendance à faire gonfler ma query…

Ché pas si vous avez un solution plus propre à proposer…
D’avance merci

Sinon si tu n’as que deux caracId max par id, tu peux aussi mettre deux champs caracId. Mais c’est pas non plus une solution propre.

Malheureusement, je peux avoir des queries sur une 40aine de caractId, c’est ça le truc trash :smiley:

Ce qui m’embete c’est que je suis sur que je peux trouver une solution propre et fresh !

En tout cas merci pour tes propositions !
Si vous avez d’autres idées, n’hésitez pas héhéh !

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

T’es un king !
Je pense que c’est une bonne piste !
Je te tiens au jus !

Gloire à toi et mille merci ! :super:

:nico: :icon_biggrin:
C’est trop merci :jap: [:oupss]

Sinon si tu dois tester des ensembles (en gros, (1,2) doit être contenu dans les ensembles de caracId de ton id), tu vas t’amuser :slight_smile: