Salut,
j'ai des raisons de croire qu'il y a un problème de structure de la base même.
Si je suis la logique, à une compagnie peut correspondre 0 à n mots-clés et un mot-clé peut décrire 0 à n compagnies.
Sur cette base, on ne devrait pas avoir 2 mais 3 tables selon le schéma suivant :
+-----------------------+ +----------------+ +----------------------------+
| companies | | kw_decrit_cie | | keywords |
+--------+---------+----+ 1:n +--------+-------+ 0:n +---------+-------------+----+
| cie_id | INT | PK |-----| cie_id | FK PK |-----| kw_id | INT | PK |
| name | VARCHAR | | | kw_id | FK PK | | libelle | VARCHAR(32) | |
+--------+---------+----+ +--------+-------+ +---------+-------------+----+
Et sur cette base, ça devient beaucoup plus simple.
J'ai créé un mini jeu d'essai sur cette base :
CREATE SCHEMA batiment;
USE batiment;
CREATE TABLE keywords (
kw_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
libelle VARCHAR(32) NOT NULL,
PRIMARY KEY(kw_id)
) ENGINE MyISAM;
INSERT INTO keywords (libelle) VALUES
('consultants'),
('contractors'),
('toiture');
CREATE TABLE companies (
cie_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(64) NOT NULL,
PRIMARY KEY(cie_id)
) ENGINE MyISAM;
INSERT INTO companies (name) VALUES
('tartempion'),
('maboite'),
('L''entreprise'),
('Les Pros');
CREATE TABLE kw_decrit_cie (
cie_id INTEGER UNSIGNED NOT NULL,
kw_id INTEGER UNSIGNED NOT NULL,
PRIMARY KEY(cie_id, kw_id),
INDEX kw_decrit_cie_FK1(cie_id),
INDEX kw_decrit_cie_FK2(kw_id)
) ENGINE MyISAM;
INSERT INTO kw_decrit_cie VALUES
(1,1),
(1,3),
(2,1),
(2,2),
(2,3);
Ce qui nous donne une première compagnie à laquelle correspondent deux mots clés, une seconde trois mots-clés et aucun pour la troisième. Donc ma requête ne devrait m'extraire que les deux premiers des trois noms de la table "companies" :
mysql> SELECT c.cie_id, c.name
-> FROM companies c
-> JOIN kw_decrit_cie kc1
-> ON c.cie_id = kc1.cie_id
-> JOIN keywords kw1
-> ON kc1.kw_id = kw1.kw_id
-> AND kw1.libelle = 'consultants'
-> JOIN kw_decrit_cie kc2
-> ON c.cie_id = kc2.cie_id
-> JOIN keywords kw2
-> ON kc2.kw_id = kw2.kw_id
-> AND kw2.libelle IN ('contractors', 'toiture')
-> GROUP BY c.cie_id;
+--------+------------+
| cie_id | name |
+--------+------------+
| 1 | tartempion |
| 2 | maboite |
+--------+------------+
2 rows in set (0.00 sec)
Et comme ça, on a pas de doublons dans la table des mots-clés ce qui n'empêche nullement de les utiliser pour plusieurs entreprises à la fois.
______________________________________________________________
Une question bien formulée, c'est un problème bien compris : ça représente déjà les 3/4 de la réponse ;)