我的桌子结构是(抱歉我的英语不好):
我想制作类别和类别。例如,如果记录具有父ID,则表示类别属于类别。我想如果任何记录有父ID,显示正确。
我测试了这个:
select tb1.id,tb1.catname,tb2.id,tb2.catname from adsystem.cat as tb1 inner join adsystem.cat as tb2 on tb1.id=tb2.parentid
但输出是:
并测试:
select tb1.id,tb1.catname,tb2.id,tb2.catname from adsystem.cat as tb1 left join adsystem.cat as tb2 on tb1.id=tb2.parentid
这几乎是:见
我不想用红线表示猫:
如果输出正确,我可以使用php
我想要完全输出(这只是photoshop):
答案 0 :(得分:1)
这就是所谓的Adjacency List
,看起来您正试图从列表中获取完整的树状视图。
这应该是你要找的东西
SELECT t1.catname AS lev1, t2.catname as lev2, t3.catname as lev3 FROM adsystem.cat AS t1
LEFT JOIN adsystem.catAS t2 ON t2.parentid = t1.id
LEFT JOIN adsystem.catAS t3 ON t3.parentid = t2.id
Adjacency List
适用于简单的固定数据,但如果您想要一个不受约束的更灵活的结构,那么我建议研究Nested Set
模型。
修改强>
您想要最后一个图像中的确切输出,这对于您的表模式是不可能的(实际上不可能),没有相关性来支持(链接/加入)和排序。你可以用一种讨厌的,hacky的方式来做这个很慢而且非常糟糕的想法,你需要在运行时在一个新列中创建自己的关联引用,然后按顺序排序 - 通过字符串连接或存储过程
为什么不能使用普通的邻接列表结构,以干净的方式获取数据,然后通过应用程序逻辑对其进行操作?
答案 1 :(得分:1)
我想这个查询是必需的:
select tb1.id,
case when tb2.catname is null
then tb1.catname
else tb2.catname
end catname,
tb1.parentid
from adsystem.cat as tb1
left join adsystem.cat as tb2 on tb1.parentid = tb2.id
也许我理解......
select tb1.id cat_id, tb1.catname cat,
tb2.id subcat_id, tb2.catname subcat from
(select distinct id, catname
from adsystem.cat
where parentid is null or parentid = '') tb1
left join adsystem.cat as tb2 on tb2.parentid = tb1.id
;