2013-09-16 5 views
2

Я пытался извлечь записи из одной таблицы в зависимости от родительской концепции parent_id. Один дополнительный столбец - это последовательность, которая определяет порядок сортировки.Self Join in Mysql

Мои данные ...

Sr.No | Name   | parent_id  | Sequence 
1. | Customer  | 0    | 0 
2. | orders  | 0    | 5 
3. | General  | 0    | 10 
4. | All   | 1    | 0 
5. | Purchased | 1    | 5 
6. | Non-Purch | 1    | 10 
7. | Pending  | 2    | 0 
8. | Change Pass | 3    | 0 
9. | Logout  | 3    | 5 

Я хочу получать из данных в одном исполнении. Хотя я не могу использовать внешнее соединение, поскольку оно не поддерживается mysql.

Моего Пробовал SQL есть ..

SELECT b.* FROM soi_admin_menu a RIGHT JOIN soi_admin_menu b ON a.menu_id = b.parent_id WHERE 1=1 AND a.parent_id = 0 ORDER BY a.sequence, b.parent_id ASC 

Я хочу данные, как это в виртуализированном образе.

--Customer 
    --All 
    --Purchased 
    --Non-Purchased 
    --Orders 
    --Pending 
    --General 
    --Change Password 
    --Logout 

со всеми полях. Моя БД MySQL

+1

внешнее соединение не поддерживается? [Я не думаю, что это правильно] (http://dev.mysql.com/doc/refman/5.0/en/outer-join-simplification.html), также см. [Этот вопрос] (http: // stackoverflow. com/questions/4796872/full-outer-join-in-mysql) для получения дополнительной информации о том, как эмулировать полные внешние соединения. – NDM

+0

Точно верно. Пользователь, о котором вы говорили, решил использовать ключевое слово UNION. – Sankalp

+0

Можете ли вы объяснить, что вы хотите? Ваш список строк кажется мне совершенно произвольным; в терминах идентификатора последовательности и родительского идентификатора вы разместили (0,0), (1,0), (1,5), (1,10), (0,5), (2,0) , (0,10), (3,0), (3,5). Я не вижу логики. – ruakh

ответ

2

Вы не можете сделать это без ВНЕШНИХ ОБЪЕДИНЕНИЙ, СОЕДИНЕНИЙ или дополнительных допущений.

Если бы вы могли предположить, что последовательность и Sr.No дают одинаковый порядок для строк с parent_id = 0, вы можете попробовать что-то вроде:

SELECT soi_admin_menu.*, 
    CASE 
     WHEN parent_id=0 THEN Sr.No * 10000 
     ELSE parent_id * 10000 + 1 + Sequence 
    END as my_order 
FROM soi_admin_menu 
ORDER BY my_order; 

Обратите внимание, что это решение дает ограничение на последовательности, id и parent (10000 в этом случае). Чтобы избавиться от ограничения, используйте конкатенацию строк и сортируйте по временному столбцу строки с хэшем более низкого, чем любой символ, в случае корневых строк.

При отсутствии OUTER не JOINS, СОЮЗЫ или дополнительные предположения, не существует никакого способа сказать, какая из

6. | Non-Purch | 1    | 10 
7. | Pending  | 2    | 0 

идет первым.

+0

Вы можете написать полный запрос. Раньше я не использовал это дело. – Sankalp

+0

Я обновил сообщение с полным запросом. –

1
SELECT *, 
    CASE 
     WHEN parent_id=0 THEN Sr.No * 100 
     ELSE parent_id * 100 + Sequence 
    END as my_order 
FROM soi_admin_menu a 
+0

Kudos, но я выбираю @bartosz Вопрос правильный, как он ответил первым. До вас тоже .. Спасибо – Sankalp