MySQL Forums
Forum List  »  French

Re: aternative à un subquery
Posted by: Jean Molliné
Date: March 08, 2008 11:25AM

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

Options: ReplyQuote


Subject
Views
Written By
Posted
5497
March 05, 2008 03:28PM
Re: aternative à un subquery
2977
March 08, 2008 11:25AM
3117
March 10, 2008 11:46AM


Sorry, you can't reply to this topic. It has been closed.

Content reproduced on this site is the property of the respective copyright holders. It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.