2016-07-18 8 views
0

Ich habe zwei Tabelle Rule und Action.Abrufen von Daten aus beiden Tabellen eins zu viele Beziehung in Mysql

Eine Regel kann viele Aktionen haben

Aktion können sagen haben a1, a2, a3 3 Reihen zu einer Regel im Zusammenhang

dann i

r1.*, a1.name, a1.createdon, a1.modifiedon, 
     a2.name, a2.createdon, a2.modifiedon, 
     a3.name, a3.createdon, a3.modifiedon 

auswählen möchten aber r2 nicht tun habe irgendeine Regel. so wird es Daten wählen Sie aus Rule nur

Ergebnis

r* 

ich diese Abfrage geschrieben habe

SELECT * 
FROM Rule RB 
LEFT JOIN (
    SELECT RelatedRuleId 
    FROM Action_ GROUP BY RelatedRuleId 
) R ON R.RelatedRuleId = RB.RuleId 

dies nicht mir richtiges Ergebnis gibt.

wie kann ich das ziehen? Ich möchte eine Regelzeile mit mehreren Aktionen in derselben Zeile.

Antwort

1

Was Sie wollen, im Klar SQL nicht erreichbar ist, da die Anzahl der Spalten in der Ergebnismenge, bevor die Ausgabe der Abfrage bekannt sein muss. In Ihrer Anforderung wird die Anzahl der Spalten durch den Inhalt der Tabellen bestimmt. Dies ist in SQL nicht möglich.

Was Sie können tun, ist entweder die Anzahl der Aktionen abfragen vorher und dynamisch die SQL mit einer geeigneten Anzahl von Spalten im Anwendungscode erstellen oder group_concat verwenden das Ergebnis in eine Spalte so verketten:

select rule.id, 
     rule.name, 
     group_concat(concat(action.name, ';', 
          action.createdon, ';', 
          action.modifiedon)) as actions 
from rule 
inner join action on rule.id = action.rule_id 
group by rule.id 

(siehe auch die SQL-Geige http://sqlfiddle.com/#!9/94596/6 mit ihm zu spielen)

Daraus ergibt sich so etwas wie:

id name actions 
1 rule1 action1;2016-01-05;2016-02-06,action2;2016-01-06;2016-02-05 
2 rule2 action3;2016-01-12;2016-02-19 

Dann müssen Sie die resultierende Spalte analysieren, indem Sie sie an den Trennern , und ; aufteilen.

1

Sie es mit einfachen links bekommen kann mitmachen

SELECT RB.* , 
     GROUP_CONCAT(R.name), 
     GROUP_CONCAT(R.createdon), 
     GROUP_CONCAT(R.modifiedon) 
    FROM Rule RB 
    LEFT JOIN Action R ON R.RelatedRuleId = RB.RuleId 
    GROUP BY RB.RuleId 
+0

Nein, ich möchte eine Regel-ID und alle Aktionsdetails in einer Zeile. nicht in separaten Zeilen –

+0

Es gibt 3 Tabellen, die er beitreten will 'a1 und a2 und a3' – RiggsFolly

+0

@RiggsFolly es nicht 3 seine 2 Tabellen.check jetzt bearbeiten –