2012-05-17 87 views
2

我有一個1:N的關係:MySQL的收集的1:n關係到一個記錄

Rule 1:n Examples 

爲了簡化起見,你可以假設,規則和實例只由一個字符串屬性。我在找一個SQL語句,我得到一個表具有以下的列:

rule; example_1; example_2; example_3 

我不關心例4和更高...

回答

0

我覺得有一個更好的辦法要做到這一點,我俯瞰,但這似乎工作正常。我自己加入了訂購的examples表,其中每個連續的示例值必須大於前一個值(從而產生前三個中的每一個)。

SELECT 
    r.rule, 
    e1.example AS example_1, 
    e2.example AS example_2, 
    e3.example AS example_3 
FROM rules r 
LEFT JOIN (SELECT * FROM examples e ORDER BY example) e1 
    ON e1.ruleID = r.ruleID 
LEFT JOIN (SELECT * FROM examples e ORDER BY example) e2 
    ON e2.ruleID = r.ruleID 
    AND e2.example > e1.example 
LEFT JOIN (SELECT * FROM examples e ORDER BY example) e3 
    ON e3.ruleID = r.ruleID 
    AND e3.example > e2.example 
GROUP BY r.ruleID 

結果:

| RULE | EXAMPLE_1 | EXAMPLE_2 | EXAMPLE_3 | 
|-------|-----------|-----------|-----------| 
| rule1 |  ex1 |  ex2 |  ex3 | 
| rule2 |  ex5 |  ex6 |  ex7 | 
| rule3 |  ex8 | (null) | (null) | 
| rule4 | (null) | (null) | (null) | 

的樣本數據:

/* rules table */ 
| RULEID | RULE | 
|--------|-------| 
|  1 | rule1 | 
|  2 | rule2 | 
|  3 | rule3 | 
|  4 | rule4 | 

/* examples table */ 
| EXAMPLE | RULEID | 
|---------|--------| 
|  ex1 |  1 | 
|  ex2 |  1 | 
|  ex3 |  1 | 
|  ex4 |  1 | 
|  ex5 |  2 | 
|  ex6 |  2 | 
|  ex7 |  2 | 
|  ex8 |  3 | 

這裏的工作SQL Fiddle example