2009-07-01 3 views
2

Ich habe fünf Tabellen:SQL verbinden über fünf Tabellen

 
models:    id, name, specification 
models_networks: id, model_id, network_id 
networks:   id, name, description 
countries_networks: id, country_id, network_id 
countries:   id, countryName, etc, etc 
  • die models Tabelle in die networks Tabelle über models_networks mit vielen zu vielen Beziehung verbunden ist.

    Wählen Sie die Modelle alle:

  • die networks Tabelle in die countries Tabelle über countries_networks mit vielen zu vielen Beziehung

ich tun müssen, die folgende Abfrage, aber ich bin fest verbunden ist, das wird in einem bestimmten Land funktionieren.

z. B .: Frankreich hat zwei Netzwerke. PigNetwork und CowNetwork. Ich möchte alle Modelle kennen lernen, die an PigNetwork oder CowNetwork arbeiten, im Prinzip alle, die in diesem Land funktionieren.

Wenn ich mich klar gemacht habe, kann jemand bitte mit der JOIN-Abfrage helfen? Ich bin nur so weit gegangen, zwei Tische vorher zu verbinden. Vielen Dank.

+0

Jungs, die ich die akzeptierte Antwort wählen zu kämpfen, da sie alle perfekt funktionieren . Vielen Dank an euch alle. –

Antwort

3
SELECT 
    m.name AS model_name, 
    c.countryName, 
    COUNT(*) AS network_count 
FROM 
    models      AS m 
    INNER JOIN models_networks AS mn ON mn.model_id = m.id 
    INNER JOIN networks   AS n ON n.id = mn.network_id 
    INNER JOIN countries_networks AS cn ON cn.network_id = n.id 
    INNER JOIN countries   AS c ON c.id = cn.country_id 
WHERE 
    c.countryName = 'France' 
GROUP BY 
    m.name, 
    c.countryName 
2
SELECT m.id 
FROM model m 
WHERE EXISTS 
     (
     SELECT NULL 
     FROM model_networks mn 
     JOIN countries_networks cn 
     ON  cn.network_id = mn.network_id 
       AND cn.country_id = @code_of_france 
     WHERE mn.model_id = m.id 
     ) 

Dies ist effizient, da es ein Modell gibt richtig, dass Moment ist es das erste geeignete Netzwerk findet.

Achten Sie darauf, die folgenden UNIQUE Indizes:

model_networks (model_id, network_id) 
country_network (country_id, network_id) 
+0

+1 Makellos, wie immer. – Tomalak

+0

@Tomalak: danke :) – Quassnoi

1
SELECT models.id, models.name, models.specifications JOIN models_networks ON models.id=models_networks.model_id WHERE models_networks.networks_id IN (1,2) 

(ersetzen 1,2 mit Ihrem Netzwerk-IDs)

Sieht nicht wie Sie brauchen zwei schließt sich, wenn Sie nur wollen die Models. Sie benötigen nur mehr Joins, wenn Sie die Netzwerk-IDs nicht kennen oder Spalten aus den anderen Tabellen benötigen. Die Syntax dafür ist jedoch die gleiche. Sie beginnen gerade mit JOIN <table> ON <field>=<field> vor der WHERE-Anweisung

3

Etwas nach dem Vorbild dieser sollte funktionieren ...

SELECT M.Name As ModelName FROM Countries C 
INNER JOIN Countries_Networks CN 
ON C.CountryId = CN.CountryId 
INNER JOIN Networks N 
ON CN.NetworkId = N.NetworkId 
INNER JOIN ModelNetworks MN 
ON MN.NetworkId = N.NetworkId 
INNER JOIN Model M 
ON M.ModelId = MN.ModelId 
WHERE C.CountryName = 'FRANCE' 
1
select models.id, models.name, models.specification from models inner join models_networks on models.id = models_network.network_id inner join countries_networks on models_network.network_id = countries_networks.network_id where countries_networks.countryName = 'France'