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级的话,这么写就可以了应该
你可以试试怎么写,我是没写出来。所以才问的。
追答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查询系统元数据
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 如何查询一个带有树结构的表的数据的主要内容,如果未能解决你的问题,请参考以下文章
SQLSERVER新建一张表然后在该表的其中一个字段上建立一个非聚集索引,那麽这张表是堆表还是B树结构的表