2017-09-27 5 views
1

Was mit meiner Anfrage falsch ist:mySQL Abfrage funktioniert nicht richtig

SELECT 
    Articles.Name, 
    GroupOfArticles.Name, 
    (select GroupOfArticles.Name from GroupOfArticles 
    where GroupOfArticles.ParentGroup= Articles.Group) 
FROM Articles 
JOIN GroupOfArticles 
    ON Articles.Group = GroupOfArticles.ID 

Ich mag den Namen des Artikels um zu zeigen, und den Namen der grundlegendsten Gruppe in der Hierarchie ...

databasemodel

+1

Können Sie einige Daten für die zwei Tabellen in Ihrer tatsächlichen Frage zusammen mit der erwarteten Ausgabe anzeigen? –

Antwort

0

Offensichtlich habe ich Ihr Schema nicht gesehen, aber ich glaube nicht, dass Sie die Sub-Auswahl überhaupt brauchen. Es scheint, dass es dasselbe wie GroupOfArticles.Name zurückgeben würde?

SELECT 
    Articles.Name, 
    GroupOfArticles.Name 
FROM 
    Articles JOIN GroupOfArticles 
     ON Articles.Group = GroupOfArticles.ID 
      AND GroupOfArticles.ParentGroup = Articles.Group 

Tatsächlich nimmt das oben dass jeder Artikel Teil einer spezifischen Gruppe sein zurückgegeben wird, und wird auch eine übergeordnete Gruppe aufweist, die die gleiche ist. Inception?

EDIT Basierend auf mehr Anforderungen/Informationen, ist hier eine zweite Version:

SELECT DISTINCT 
    a.Name, 
    g.Name 
FROM 
    GroupOfArticles g INNER JOIN GroupOfArticles g1 
     ON g1.ParentGroup = g.ID 
     INNER JOIN Articles a ON 
      CASE 
       WHEN g.ParentGroup IS NULL THEN g.ID 
       ELSE g1.ID 
      END 

Ich habe auch eine SQLFiddle für das oben.

EDIT 2 Eine alternative Version, die nicht JOIN OR CASE enthält:

SELECT DISTINCT 
    a.Name, 
    g.Name 
FROM 
    Articles a, GroupOfArticles g, GroupOfArticles g1 
WHERE 
     g.ID <> g1.ID 
    AND g.ParentGroup IS NULL 
    AND 
    ( 
      a.Group = g.ID 
     OR a.Group = g1.ID AND g1.ParentGroup = g.ID 
    ) 

SQLFiddle

Beachten Sie, dass in den letzten beiden Abfragen, können Sie die DISTINCT Schlüsselwort mit GROUP BY a.Name HAVING COUNT(*) > 0 ersetzen könnte, wenn Sie müssen diese Konstrukte auch wirklich verwenden. Entfernen Sie einfach DISTINCT von der Spitze und fügen Sie die GROUP BY ... am Ende hinzu.

+0

Entsprechend Ihrem gelieferten Bild möchten Sie den Artikelnamen und den Namen/die Beschreibung von (die Gruppe, zu der sie gehört, wenn diese Gruppe kein Elternteil hat, ODER die Elterngruppe, wenn diese Gruppe kein Elternteil hat, ODER .. .). –

+0

Wenn ich richtig liege, dann sollte Ihre gewünschte Ausgabe beinhalten: 'Merix - Zum Waschen von Kleidung' und' Duli - Zum Waschen von Kleidung'. Wenn dies nicht korrekt ist, müssen Sie die tatsächlichen Geschäftsregeln angeben, mit denen Sie arbeiten. –

+0

Ja ... siehe oben. Bitte beachten Sie, dass das Schreiben von Joins ohne das 'JOIN'-Schlüsselwort keine gute Idee ist. Es funktioniert, aber Sie müssen wissen, was Sie tun, und Lesbarkeit/Portabilität ist nicht so gut wie bei der Verwendung von 'JOIN's. –

1

Sie müssen die Unterabfrage außerhalb der eigentlichen Unterabfrage wie

SELECT a.Name, g.Name, 
FROM Articles a 
INNER JOIN (select Name,ParentGroup from GroupOfArticles) g 
    ON g.ID   =a.Group 
    AND g.ParentGroup=a.group 

die JOIN eigentliche Abfrage gezeigt, auch ohne die Unterabfrage durchgeführt werden, wie

SELECT a.Name, g.Name, 
FROM Articles a 
INNER JOIN GroupOfArticles g 
    ON g.ID   =a.Group 
    AND g.ParentGroup=a.group 

Obwohl ich bezweifle sehr, dass Sie wirklich auf beiden Spalten anschließen möchten: ID und ParentGroup?

Verwandte Themen