自我加入Mysql

时间:2013-09-16 08:27:05

标签: mysql sql database relational-database

我一直在尝试根据child和parent的parent_id概念从同一个表中获取记录。一个额外的列是定义排序顺序的序列。

我的数据是......

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支持。

My Tried sql is ..

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

2 个答案:

答案 0 :(得分:3)

如果没有OUTER JOINS,UNIONS或其他假设,你就无法做到。

如果您可以假设,Sequence和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;

请注意,此解决方案为您提供了Sequence,id和parent的限制(在本例中为10000)。要摆脱限制,请使用字符串连接,并按字符串时间列排序,如果是根行,则使用低于任意字符的哈希值。

没有OUTER JOINS,UNIONS或其他假设,没有办法说出哪一个

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

先行。

答案 1 :(得分: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