mysql 如何查询一个带有树结构的表的数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 如何查询一个带有树结构的表的数据相关的知识,希望对你有一定的参考价值。

比如地区表吧,里面有省、市、区、地区、小区,我要通过省查到这个省下面的四级所有数据,怎么弄?谁能帮我写一个function?或者存储过程也行,特别提示不要复制现在百度谷歌能查找的那些,我都看不过了,不需复制过来!

当然这种结构就不要追求什么效率了。如果要效率高的,只能改表结构。

1:select p2.id from table p1 ,table p2 where p1.id=p2.pid and p1.id=0
2:假设表名是tree
SQL codeselect distinct a.id from tree as a inner join tree as b on (a.pid = b.pid) where b.pid >=0;
select distinct a.id from tree as a inner join tree as b on (a.pid = b.pid) where b.pid >=2;

3.通过程序或数据库的store procedure来实现了。 在mysql中无法以一句SQL实现。
参考技术A 这种叫无限级分类。,一般用递归的思想实现,无线的分类
具体的你可以百度搜索 无限级分类
参考技术B 你总得把表结构写出来吧追问

就三个字段:id 、pid、areaName

记录:
1、0、中国
2、1、广东省
3、2、深圳市
4、3、福田区
5、4、八卦岭

查询广东省下面的所有地区节点。传递一个id给你,就是广东的id。

追答

select * from test123 t where t.id = 2
union
select * from test123 t where t.pid = 2
union
select * from test123 t where t.pid in (select id from test123 t where t.pid = 2)
union
select * from test123 t where t.pid in (select id from test123 t where t.pid in (select id from test123 t where t.pid = 2))
你这边最多4级的话,这么写就可以了应该

参考技术C 这个叫无限极分类 这个用php 或你所用的语言来写,javascript写这个理念是不对的。 采用面向对象的方法 用数组的思维 很容易OK的 直接要代码,我感觉 没必要追问

你可以试试怎么写,我是没写出来。所以才问的。

追答

child($arr,$pid);
if(empty($child))
return null;

foreach ($child as $k => $v)

$act = $this ->childList($arr,$v['cat_id']);
if($act!=null)

$child[$k]['child'] = $act;

return $child;





?>

这个是我以前一个商城项目的无线分类的导航远吗 你看看吧。 主要是 数据库设计字段的合理就行

如何通过sql 查看表的结构

在查询分析器中用SQL语句

可输入以下编码进行查看

    sp_help tablename  (tablename是你要查看表结构的表名)

    select * from information_schema.columns where table_name=你要查的表名

    初级:使用管理工具SSMS    右侧对象树展开即可

    中级:sp_HelpText 表名

    高级:用SQL查询系统元数据

参考技术A 在查询分析器中用SQL语句:sp_help tablename (tablename是你要查看表结构的表名) 参考技术B select * from information_schema.columns where table_name='你要查的表名' 参考技术C 下边是SQLSERVER查询数据字典的语法,如果相查某一个表,只需要加where条件一个表名的连接即可。
SELECT TOP 100 PERCENT --a.id,
CASE WHEN a.colorder = 1 THEN d.name ELSE '' END AS 表名,
CASE WHEN a.colorder = 1 THEN isnull(f.value, '') ELSE '' END AS 表说明,
a.colorder AS 字段序号, a.name AS 字段名, CASE WHEN COLUMNPROPERTY(a.id,
a.name, 'IsIdentity') = 1 THEN '√' ELSE '' END AS 标识,
CASE WHEN EXISTS
(SELECT 1
FROM dbo.sysindexes si INNER JOIN
dbo.sysindexkeys sik ON si.id = sik.id AND si.indid = sik.indid INNER JOIN
dbo.syscolumns sc ON sc.id = sik.id AND sc.colid = sik.colid INNER JOIN
dbo.sysobjects so ON so.name = si.name AND so.xtype = 'PK'
WHERE sc.id = a.id AND sc.colid = a.colid) THEN '√' ELSE '' END AS 主键,
b.name AS 类型, a.length AS 长度, COLUMNPROPERTY(a.id, a.name, 'PRECISION')
AS 精度, ISNULL(COLUMNPROPERTY(a.id, a.name, 'Scale'), 0) AS 小数位数,
CASE WHEN a.isnullable = 1 THEN '√' ELSE '' END AS 允许空, ISNULL(e.text, '')
AS 默认值, ISNULL(g.[value], '') AS 字段说明, d.crdate AS 创建时间,
CASE WHEN a.colorder = 1 THEN d.refdate ELSE NULL END AS 更改时间
FROM dbo.syscolumns a LEFT OUTER JOIN
dbo.systypes b ON a.xtype = b.xusertype INNER JOIN
dbo.sysobjects d ON a.id = d.id AND d.xtype = 'U' AND
d.status >= 0 LEFT OUTER JOIN
dbo.syscomments e ON a.cdefault = e.id LEFT OUTER JOIN
dbo.sysproperties g ON a.id = g.id AND a.colid = g.smallid AND
g.name = 'MS_Description' LEFT OUTER JOIN
dbo.sysproperties f ON d.id = f.
id AND f.smallid = 0 AND
f.name = 'MS_Description'
where d.name = '表名'---查询固定表,如果所有,去掉where条件
ORDER BY d.name, a.colorder

ORACLE数据库使用USER_TAB_COLUMNS表
select TABLE_NAME,
COLUMN_NAME,
DATA_TYPE,
DATA_LENGTH
from USER_TAB_COLUMNS
参考技术D sp_MShelpcolumns 'tablename'

以上是关于mysql 如何查询一个带有树结构的表的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何通过sql 查看表的结构

mysql索引原理及优化

SQLSERVER新建一张表然后在该表的其中一个字段上建立一个非聚集索引,那麽这张表是堆表还是B树结构的表

如何使用 PHP 处理从 SQL 查询返回的树结构?

mysql 千万级数据库如何进行多张结构相同的表联合查询?如何优化或设置提高查询速度?

如何从数据库中的表生成树结构?