2013-12-17 3 views
1

У меня есть родительская таблица, назовите ее parents. У каждого родителя есть некоторое количество детей во второй таблице, которая называется children. Типичным левым соединением было бы что-то вроде этого:Присоединение родителя с одним примером дочернего элемента

select * 
from parents p 
left join children c 
on p.id = c.parent_id 

Но это возвращает каждую дочернюю строку и повторяет всю родительскую информацию. Вместо этого я хочу вместо этого (для этого приложения) первым ребенком для каждого родителя, так что у набора результатов есть такое же количество строк, что и родительская таблица.

Parent1 Child_of_parent1_1 
Parent2 Child_of_parent2_1 
Parent3 Child_of_parent3_1 

Я попытался отличить себя в странных местах, но, похоже, не мог это понять.

+1

добавить GROUP BY parent_id в конце запроса –

+0

Хм, это определенно работает в mySql, но я не уверен, что он работает кросс-платформенно. Поскольку это среда mySql, я не думаю, что мне все равно: D. Спасибо за идею. – Chris

ответ

1
SELECT A.* FROM 
(
    SELECT p.*, c.child_id, some_field_of_children 
    FROM parents p 
    LEFT JOIN children c ON p.id = c.parent_id 
) A 
WHERE A.child_id = (SELECT MIN(B.child_id) FROM children B WHERE B.parent_id = A.parent_id) 

Я предполагаю, что таблица children имеет «child_id» в качестве своего ПК, который мы можем использовать для получения первого ребенка.

Вы можете заменить child_id другой колонке, как 'временную метку' ИЛИ ​​'child_position', ...

+0

Хорошее решение, я думаю, это можно сделать без первого подзапроса. Спасибо за помощь. – Chris

+0

Первый подзапрос (A) необходим. Вы можете проверить. – Loc

0

Freehand SQL: Select * от родительской р перекрестное соединение ребенка гр где c.Id = (выберите тах (c2.id) из детского c2, где c2.ParentId = p.Id)

Что-то например, он получит 1 ребенка с текущим родителем и присоединится к двум. Если вы хотите вернуть вещи, если нет детей, апп:

или не существует (выберите макс (c3.id) от детей с3 где c3.ParentId = p.Id)

Приветствия -

0
select 
p.parent_id, 
p.name as parent_name, 
c.name as child_name 
from parent p 
join(
    select * from child where child_id in(
     select child_id from child 
     group by parent_id)) c 
on p.parent_id = c.parent_id 

SQL Скрипки:http://sqlfiddle.com/#!2/03fdc/14

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