SELECT *
FROM
Principale
LEFT JOIN
Liaison
ON
Principale.id=Liaison.refid
WHERE
(Liaison.propriete="Rouge" AND Liaison.propriete="Vert")
SELECT *
FROM
Principale
LEFT JOIN
Liaison
ON
Principale.id=Liaison.refid
WHERE
(Liaison.propriete="Rouge" AND Liaison.propriete="Vert")
SELECT *
FROM
Principale
LEFT JOIN
Liaison
ON
Principale.id=Liaison.refid
WHERE
(Liaison.propriete="Rouge" AND Liaison.propriete="Vert")
SELECT *
FROM
principale
LEFT JOIN
liaison
ON
principale.id=liaison.refid
WHERE
(liaison.propriete="Rouge" AND liaison.propriete="Vert")
liaison.propriete="Rouge" OR liaison.propriete="Vert"
c'est pas mieux ?
SELECT *
FROM
principale
LEFT JOIN
liaison
ON
principale.id=liaison.refid
WHERE
(liaison.propriete="Rouge" AND liaison.propriete="Vert")
liaison.propriete="Rouge" OR liaison.propriete="Vert"
c'est pas mieux ?
SELECT *
FROM
principale
LEFT JOIN
liaison
ON
principale.id=liaison.refid
WHERE
(liaison.propriete="Rouge" AND liaison.propriete="Vert")
liaison.propriete="Rouge" OR liaison.propriete="Vert"
c'est pas mieux ?
CREATE TABLE `eod_db`.`principale` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`nom` VARCHAR( 10 ) NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB
INSERT INTO `principale` (`id`, `nom`) VALUES
(1, 'voiture'),
(2, 'maison'),
(3, 'chaussure'),
(4, 'marteau');
CREATE TABLE `eod_db`.`liaison` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`refid` INT( 10 ) NULL ,
`propriete` VARCHAR( 10 ) NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB
INSERT INTO `liaison` (`id`, `refid`, `propriete`) VALUES
(1, 1, 'Rouge'),
(2, 1, 'Vert'),
(3, 2, 'Rouge');
SELECT *
FROM
principale
LEFT JOIN
liaison
ON
principale.id=liaison.refid
WHERE
(liaison.propriete="Rouge" AND liaison.propriete="Vert")liaison.propriete="Rouge" OR liaison.propriete="Vert"
c'est pas mieux ?
Oui et non : ca me ressort les enregistrements rouge ou vert :
Or, je recherche tous les enregistrements donc les couleurs sont
"Rouge et Vert".
CREATE TABLE `eod_db`.`principale` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`nom` VARCHAR( 10 ) NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB
INSERT INTO `principale` (`id`, `nom`) VALUES
(1, 'voiture'),
(2, 'maison'),
(3, 'chaussure'),
(4, 'marteau');
CREATE TABLE `eod_db`.`liaison` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`refid` INT( 10 ) NULL ,
`propriete` VARCHAR( 10 ) NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB
INSERT INTO `liaison` (`id`, `refid`, `propriete`) VALUES
(1, 1, 'Rouge'),
(2, 1, 'Vert'),
(3, 2, 'Rouge');
SELECT *
FROM
principale
LEFT JOIN
liaison
ON
principale.id=liaison.refid
WHERE
(liaison.propriete="Rouge" AND liaison.propriete="Vert")
liaison.propriete="Rouge" OR liaison.propriete="Vert"
c'est pas mieux ?
Oui et non : ca me ressort les enregistrements rouge ou vert :
Or, je recherche tous les enregistrements donc les couleurs sont
"Rouge et Vert".
CREATE TABLE `eod_db`.`principale` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`nom` VARCHAR( 10 ) NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB
INSERT INTO `principale` (`id`, `nom`) VALUES
(1, 'voiture'),
(2, 'maison'),
(3, 'chaussure'),
(4, 'marteau');
CREATE TABLE `eod_db`.`liaison` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`refid` INT( 10 ) NULL ,
`propriete` VARCHAR( 10 ) NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB
INSERT INTO `liaison` (`id`, `refid`, `propriete`) VALUES
(1, 1, 'Rouge'),
(2, 1, 'Vert'),
(3, 2, 'Rouge');
SELECT *
FROM
principale
LEFT JOIN
liaison
ON
principale.id=liaison.refid
WHERE
(liaison.propriete="Rouge" AND liaison.propriete="Vert")liaison.propriete="Rouge" OR liaison.propriete="Vert"
c'est pas mieux ?
Oui et non : ca me ressort les enregistrements rouge ou vert :
Or, je recherche tous les enregistrements donc les couleurs sont
"Rouge et Vert".
mon impression est que la question était mal posée parce que les
tables sont mal construites; il semblerait que chaque item de la
table principale puisque contenir différentes propriétés et que
vous cherchez les lignes de cette table qui respectent plusieurs
critères de la seconde.
si c'est le cas, les tables sont mal construites car un champ lié
de la table 2 ne servira jamais seul mais (comme pour ce problème)
vous voudrez (souvent, toujours, ...) récupérer toutes les props
appliqués à un record de la table 1, dès lors un champ propriétés
de type VARCHAR(255) ou TEXT contenant "Rouge, Vert" lorsque les
2 s'appliquent simplifierait tout.
ie:
principale
1 'voiture'
2 'maison'
...
liaison
1 1 'Rouge, Vert'
2 2 'Rouge'
...
pour rechercher dans la table secondaire les id contenant les
même refid et l'une ou l'autre des 2 propriétés recherchées
vous pouvez faire une jointure naturelle de la table sur elle-
même, cela nous donnent alors les refid qui servent à sélectionner
les bons id dans la table primaire (un champ lié, principale.id
et liaison.refid devraient évidemment porter le même nom pour
faciliter la lecture mais ce n'est pas le propos).
il vient donc:
SELECT * FROM principale p WHERE p.id IN (
SELECT p1.id FROM liaison p1
INNER JOIN liaison p2 ON p2.refid=p1.refid
WHERE (p1.propriete="Rouge" AND p2.propriete="Vert")
)
mon impression est que la question était mal posée parce que les
tables sont mal construites; il semblerait que chaque item de la
table principale puisque contenir différentes propriétés et que
vous cherchez les lignes de cette table qui respectent plusieurs
critères de la seconde.
si c'est le cas, les tables sont mal construites car un champ lié
de la table 2 ne servira jamais seul mais (comme pour ce problème)
vous voudrez (souvent, toujours, ...) récupérer toutes les props
appliqués à un record de la table 1, dès lors un champ propriétés
de type VARCHAR(255) ou TEXT contenant "Rouge, Vert" lorsque les
2 s'appliquent simplifierait tout.
ie:
principale
1 'voiture'
2 'maison'
...
liaison
1 1 'Rouge, Vert'
2 2 'Rouge'
...
pour rechercher dans la table secondaire les id contenant les
même refid et l'une ou l'autre des 2 propriétés recherchées
vous pouvez faire une jointure naturelle de la table sur elle-
même, cela nous donnent alors les refid qui servent à sélectionner
les bons id dans la table primaire (un champ lié, principale.id
et liaison.refid devraient évidemment porter le même nom pour
faciliter la lecture mais ce n'est pas le propos).
il vient donc:
SELECT * FROM principale p WHERE p.id IN (
SELECT p1.id FROM liaison p1
INNER JOIN liaison p2 ON p2.refid=p1.refid
WHERE (p1.propriete="Rouge" AND p2.propriete="Vert")
)
mon impression est que la question était mal posée parce que les
tables sont mal construites; il semblerait que chaque item de la
table principale puisque contenir différentes propriétés et que
vous cherchez les lignes de cette table qui respectent plusieurs
critères de la seconde.
si c'est le cas, les tables sont mal construites car un champ lié
de la table 2 ne servira jamais seul mais (comme pour ce problème)
vous voudrez (souvent, toujours, ...) récupérer toutes les props
appliqués à un record de la table 1, dès lors un champ propriétés
de type VARCHAR(255) ou TEXT contenant "Rouge, Vert" lorsque les
2 s'appliquent simplifierait tout.
ie:
principale
1 'voiture'
2 'maison'
...
liaison
1 1 'Rouge, Vert'
2 2 'Rouge'
...
pour rechercher dans la table secondaire les id contenant les
même refid et l'une ou l'autre des 2 propriétés recherchées
vous pouvez faire une jointure naturelle de la table sur elle-
même, cela nous donnent alors les refid qui servent à sélectionner
les bons id dans la table primaire (un champ lié, principale.id
et liaison.refid devraient évidemment porter le même nom pour
faciliter la lecture mais ce n'est pas le propos).
il vient donc:
SELECT * FROM principale p WHERE p.id IN (
SELECT p1.id FROM liaison p1
INNER JOIN liaison p2 ON p2.refid=p1.refid
WHERE (p1.propriete="Rouge" AND p2.propriete="Vert")
)
Principale :
id,nom
Liaison : (le refid de cette table est lié à l'id de la table
principale) id,refid,propriete
Principale :
id,nom
Liaison : (le refid de cette table est lié à l'id de la table
principale) id,refid,propriete
Principale :
id,nom
Liaison : (le refid de cette table est lié à l'id de la table
principale) id,refid,propriete
un champ propriétés de type VARCHAR(255) ou TEXT contenant
[toutes les propriétés]
Oui, ca simplifierai, mais je ne veux pas le faire de cette façon.
un champ propriétés de type VARCHAR(255) ou TEXT contenant
[toutes les propriétés]
Oui, ca simplifierai, mais je ne veux pas le faire de cette façon.
un champ propriétés de type VARCHAR(255) ou TEXT contenant
[toutes les propriétés]
Oui, ca simplifierai, mais je ne veux pas le faire de cette façon.
un champ propriétés de type VARCHAR(255) ou TEXT contenant
[toutes les propriétés]
Oui, ca simplifierai, mais je ne veux pas le faire de cette façon.
dire pourquoi aurait été en charte et sûrement intéressant.
si les N propriétés (N petit) résulte de choix indépendant
d'une interface (des listes de valeurs imposées avec une
possibilité "d'ajouter un critère"), le choix est peut être
le plus simple.
mais si ce champ peut être construit plus librement et (surtout)
s'il ne doit pas être "déconstruit" (décomposé pour en réextraire
chacune des propriétés individuelles), un champ TEXT reste le plus
efficace; vous disposez via MySQL d'outils de recherches multi-critères
sur de tels champs et ils sont très efficaces.
CREATE TABLE principale (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`nom` TEXT default NULL,
PRIMARY KEY ( `id` )
) ENGINE = MyISAM;
INSERT INTO `principale` (`id`, `nom`) VALUES
(1, 'voiture'),
(2, 'maison'),
(3, 'chaussure'),
(4, 'marteau');
CREATE TABLE liaison (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`refid` INT( 10 ) NOT NULL references principale(id),
`propriete` TEXT default NULL ,
PRIMARY KEY ( `id` ),
INDEX ( `refid` ),
FULLTEXT ( `propriete` )
) ENGINE = MyISAM;
INSERT INTO `liaison` (`id`, `refid`, `propriete`) VALUES
(1, 1, 'Rouge Vert'),
(2, 1, 'Rouge'),
(3, 1, 'Bleu'),
(4, 1, 'Noir'),
(5, 2, 'Bleu');
(j'utilise le moteur ISAM et non InnoDB car celui-ci ne supporte
pas les index full-text.
j'ai également ajouté qlq propriétés pour que la recherche ne risque
pas de retrouver plus de 50% de la table - sans quoi le mot est
considéré non pertinent et est exclu de la réponse).
on peut alors faire la recherche par:
SELECT * FROM principale p inner join liaison s on s.refid=p.id
WHERE MATCH (s.propriete) AGAINST ('+Rouge +Vert' IN BOOLEAN MODE);
un champ propriétés de type VARCHAR(255) ou TEXT contenant
[toutes les propriétés]
Oui, ca simplifierai, mais je ne veux pas le faire de cette façon.
dire pourquoi aurait été en charte et sûrement intéressant.
si les N propriétés (N petit) résulte de choix indépendant
d'une interface (des listes de valeurs imposées avec une
possibilité "d'ajouter un critère"), le choix est peut être
le plus simple.
mais si ce champ peut être construit plus librement et (surtout)
s'il ne doit pas être "déconstruit" (décomposé pour en réextraire
chacune des propriétés individuelles), un champ TEXT reste le plus
efficace; vous disposez via MySQL d'outils de recherches multi-critères
sur de tels champs et ils sont très efficaces.
CREATE TABLE principale (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`nom` TEXT default NULL,
PRIMARY KEY ( `id` )
) ENGINE = MyISAM;
INSERT INTO `principale` (`id`, `nom`) VALUES
(1, 'voiture'),
(2, 'maison'),
(3, 'chaussure'),
(4, 'marteau');
CREATE TABLE liaison (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`refid` INT( 10 ) NOT NULL references principale(id),
`propriete` TEXT default NULL ,
PRIMARY KEY ( `id` ),
INDEX ( `refid` ),
FULLTEXT ( `propriete` )
) ENGINE = MyISAM;
INSERT INTO `liaison` (`id`, `refid`, `propriete`) VALUES
(1, 1, 'Rouge Vert'),
(2, 1, 'Rouge'),
(3, 1, 'Bleu'),
(4, 1, 'Noir'),
(5, 2, 'Bleu');
(j'utilise le moteur ISAM et non InnoDB car celui-ci ne supporte
pas les index full-text.
j'ai également ajouté qlq propriétés pour que la recherche ne risque
pas de retrouver plus de 50% de la table - sans quoi le mot est
considéré non pertinent et est exclu de la réponse).
on peut alors faire la recherche par:
SELECT * FROM principale p inner join liaison s on s.refid=p.id
WHERE MATCH (s.propriete) AGAINST ('+Rouge +Vert' IN BOOLEAN MODE);
un champ propriétés de type VARCHAR(255) ou TEXT contenant
[toutes les propriétés]
Oui, ca simplifierai, mais je ne veux pas le faire de cette façon.
dire pourquoi aurait été en charte et sûrement intéressant.
si les N propriétés (N petit) résulte de choix indépendant
d'une interface (des listes de valeurs imposées avec une
possibilité "d'ajouter un critère"), le choix est peut être
le plus simple.
mais si ce champ peut être construit plus librement et (surtout)
s'il ne doit pas être "déconstruit" (décomposé pour en réextraire
chacune des propriétés individuelles), un champ TEXT reste le plus
efficace; vous disposez via MySQL d'outils de recherches multi-critères
sur de tels champs et ils sont très efficaces.
CREATE TABLE principale (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`nom` TEXT default NULL,
PRIMARY KEY ( `id` )
) ENGINE = MyISAM;
INSERT INTO `principale` (`id`, `nom`) VALUES
(1, 'voiture'),
(2, 'maison'),
(3, 'chaussure'),
(4, 'marteau');
CREATE TABLE liaison (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`refid` INT( 10 ) NOT NULL references principale(id),
`propriete` TEXT default NULL ,
PRIMARY KEY ( `id` ),
INDEX ( `refid` ),
FULLTEXT ( `propriete` )
) ENGINE = MyISAM;
INSERT INTO `liaison` (`id`, `refid`, `propriete`) VALUES
(1, 1, 'Rouge Vert'),
(2, 1, 'Rouge'),
(3, 1, 'Bleu'),
(4, 1, 'Noir'),
(5, 2, 'Bleu');
(j'utilise le moteur ISAM et non InnoDB car celui-ci ne supporte
pas les index full-text.
j'ai également ajouté qlq propriétés pour que la recherche ne risque
pas de retrouver plus de 50% de la table - sans quoi le mot est
considéré non pertinent et est exclu de la réponse).
on peut alors faire la recherche par:
SELECT * FROM principale p inner join liaison s on s.refid=p.id
WHERE MATCH (s.propriete) AGAINST ('+Rouge +Vert' IN BOOLEAN MODE);