如何选择具有相同值的两列,如果在mysql中具有父ID,则忽略列

时间:2014-03-03 14:30:58

标签: mysql sql

我的桌子结构是(抱歉我的英语不好):

enter image description here

我想制作类别和类别。例如,如果记录具有父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

但输出是:

enter image description here

并测试:

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

这几乎是:见

enter image description here 我不想用红线表示猫:

enter image description here

如果输出正确,我可以使用php

我想要完全输出(这只是photoshop):

enter image description here

2 个答案:

答案 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
;