2017-01-13 4 views
0

Это поддельные имена таблиц, но в моей реальной проблеме представьте бизнес-правило, в котором говорится, что каждый родитель имеет 1 или 2 детей. Эти дети имеют число 0 или 1. у двух детей одного и того же родителя не может быть одинакового числа.MySQL: объедините 2 строки из другой таблицы в одну строку результата

Я хочу получить доступ к полям в строках children, но хочу, чтобы значения были помещены в поле с префиксом числа. Пример:

parenttochildrenassoc:

+-------------+-------------+ 
| parent | child | 
+-------------+-------------+ 
|  1  |  1  | 
|  1  |  2  | 
|  2  |  3  | 
|  3  |  4  | 
+-------------+-------------+ 

детей:

+-------------+-------------+------------+ 
| child | number | name | 
+-------------+-------------+------------+ 
|  1  |  0  | Chuck | 
|  2  |  1  | Sally | 
|  3  |  0  | Carly | 
|  4  |  1  | Billy | 
+-------------+-------------+------------+ 

желаемого результата:

+-------------+-------------+------------+ 
| parent | child0 | child1 | 
+-------------+-------------+------------+ 
|  1  | Chuck | Sally | 
|  2  | Carly |  NULL | 
|  3  |  NULL | Billy | 
+-------------+-------------+------------+ 

Ближайший я мог бы получить ниже:

SELECT A.parent, C0.name as child0, C1.name as child1 
FROM parenttochildassoc A 
    LEFT JOIN children C0 ON C0.child = A.child AND C0.number = 0 
    LEFT JOIN children C1 ON C1.child = A.child AND C1.number = 1 

, которая производит это:

+-------------+-------------+------------+ 
| parent | child0 | child1 | 
+-------------+-------------+------------+ 
|  1  | Chuck |  NULL | 
|  1  |  NULL | Sally | 
|  2  | Carly |  NULL | 
|  3  |  NULL | Billy | 
+-------------+-------------+------------+ 

Как я могу придавить это? Он кажется очень похожим на «поворот», описанный в этом answer (один из предложенных ответов идентичен моей попытке), но тот факт, что parenttochildrenassoc много-много, кажется, нарушает его.

+0

Есть ли максимальное количество детей в родителей? – shmosel

+0

1 или 2 детей – thedarklord47

ответ

1

Вы действительно можете сделать это с помощью условной агрегации и только один присоединиться:

SELECT a.parent, 
     MAX(CASE WHEN c.number = 0 THEN c.name END) as child0, 
     MAX(CASE WHEN c.number = 1 THEN c.name END) as child1 
FROM parenttochildassoc a LEFT JOIN 
    children c 
    ON C0.child = A.child 
GROUP BY a.parent; 

Вы можете легко расширить это любое количество детей, которых вы хотите.

Если вы можете жить со всеми детьми в одной области, а затем использовать group_concat():

SELECT a.parent, 
     GROUP_CONCAT(c.name ORDER BY c.number) as children 
FROM parenttochildassoc a LEFT JOIN 
    children c 
    ON C0.child = A.child 
GROUP BY a.parent; 
+0

действительно приятно спасибо – thedarklord47

0

Вы можете добавить группировку на parent колонке разрушаться подобные родительские строки:

SELECT A.parent, 
     MAX(C0.name) AS child0, 
     MAX(C1.name) AS child1 
FROM parenttochildassoc A 
LEFT JOIN children C0 
    ON C0.child = A.child AND C0.number = 0 
LEFT JOIN children C1 
    ON C1.child = A.child AND C1.number = 1 
GROUP BY A.parent 

Причина это должно работать в том, что функция MAX() игнорирует NULL значения. Следовательно, когда агрегируются две строки с parent = 1, в результирующем наборе будет отображаться только значение не NULL.

+0

будет ли это работать, если мне нужно получить доступ к дополнительным полям в 'children'? Могу ли я просто взять максимум этих? – thedarklord47

+0

Да, вы можете просто добавить дополнительные поля, но вы должны посмотреть на ответ Гордона, потому что это немного более прямолинейно. –

 Смежные вопросы

  • Нет связанных вопросов^_^