2015-07-10 2 views
0

У меня есть эта таблица:Mysql автообъединение дает странные результаты

id|subject   | parent_id 
1 |ladbore   | 2 
2 |quod    | NULL 
3 |cumque   | 6 
4 |ut    | 3 
5 |sed    | NULL 
6 |reprehenderit | 1 
7 |qui    | 4 
8 |eum    | 6 
9 |deserunt   | 6 
10 |et    | 6 

Теперь я создал автообъединение, чтобы получить все предметы, включая имя субъекта родителя, как так:

SELECT 
`subject`. `id`, 
`subject`.`subject` AS `subject_name`, 
`parent`.`subject` AS `parent_name` 
FROM 
`subjects` AS `subject` 
LEFT JOIN 
`subjects` AS `parent` 
ON 
`parent`.`id` = `subject`.`id`; 

Однако это дает мне странный результат:

id subject_name parent_name 
1 labore   labore 
2 quod   quod 
3 cumque   cumque 
4 ut    ut 
5 sed    sed 
6 reprehenderit reprehenderit 
7 qui    qui 
8 eum    eum 
9 eserunt   deserunt 
10 et    et 

Почему это даст неправильный результат?

ответ

1

Вы просто присоединяетесь к рекордам против себя, так как у вас есть parent.id = subject.id. Если вы хотите древовидную структуру в вашей таблице, то вам нужно (id, parent_id, ...) как поля, и присоединиться на subject.parent_id = parent.id

1

Ваш запрос должен быть

SELECT 
`subject`. `id`, 
`subject`.`subject` AS `subject_name`, 
`parent`.`subject` AS `parent_name` 
FROM 
`subjects` AS `subject` 
LEFT JOIN 
`subjects` AS `parent` 
ON 
`parent`.`id` = `subject`.`parent_id`;