假如现在有表结构:

首先看一下mysql的这个函数CONCAT(str1,str2,…)

ASP查询无限级分类子栏目ID
我写了一个查询无限级子栏目ID的函数,代码如下:
Function ChildSort(Cuz,SortID)
fSortID = Int
Set RsLs=server.CreateObject(“adodb.recordset”)
Sql=”Select SortID From [Cuz_”&Cuz&”Sort] where ParentID=”&fSortID&”
order by SortSeq”
RsLs.Open Sql,Conn,1,1
While Not RsLs.Eof
ChildSort=ChildSort&”,”&Int(RsLs)&ChildSort(Cuz,RsLs)
RsLs.MoveNext
Wend

有这样一个表,id是分类的ID,name是分类名称,pid是上级分类的ID。

function getsortinfo($sortid){

CREATE TABLE `msg_detail` (
    `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
    `title` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '标题',
    `content` TEXT NOT NULL COMMENT '内容',
    `audio_url` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '音频地址',
    `type_id` TINYINT(4) NOT NULL DEFAULT '0',
     PRIMARY KEY (`id`),
    INDEX `cid` (`cid`) USING BTREE,
    INDEX `column_id` (`column_id`) USING BTREE
)
COMMENT='内参表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;

返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为
NULL。或许有一个或多个参数。
如果所有参数均为非二进制字符串,则结果为非二进制字符串。
如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型
cast, 例如:SELECT CONCAT(CAST(int_col AS CHAR), char_col)

RsLs.Close:Set RsLs=Nothing
End Function
显示结果是“,1,2,3”的形式,如何在函数内把最前面的“,”去掉,注意我说的函数内解决

现在有个分类ID,程序要找到它上级的上级的上级……分类的ID,简单说就是找出顶级分类的ID。
比如“新鲜水果”的ID是13,对应父类ID是5,而5的父ID是1,1没有父类,也就是顶级分类了。

$fl = isset($sortid) ? $sortid : -1;

 

mysql> SELECT CONCAT(‘My’, ‘S’, ‘QL’);

以前年轻气盛不懂事,总想着用递归来查找,然后再将结果缓存来解决性能问题。
后来又试过将整个表缓存起来,再递归查找。
再后来……似乎比较少有机会遇到无限级分类……

$db = MySql::getInstance();

  查询所有类型内参最大id,可用如下sql: 

-> ‘MySQL’

最近有个同事问我怎么“优雅”的解决这个问题。
于是我灵机一动,就有了如下解决方案:

$sql = “SELECT * FROM “.DB_PREFIX.”sort WHERE  sid = “.$fl;

 select
max(id),type_id from msg_detail group by type_id; 

mysql> SELECT CONCAT(‘My’, NULL, ‘QL’);

<?php
$sql = "select id, pid from tablename ";
// 查询后 将结果处理成 如下数组格式
$arr = [
  // id => pid
  1 => 0,
  // 省略...
  5 => 1,
  // 省略...
  13 => 5
];
// 建议将这数组缓存起来

$id = 13;
while($arr[$id]) {
  $id = $arr[$id];
}
echo $id; // 1

$result = $db->query($sql);

 

-> NULL

不得不说:真是太优雅了!连我都佩服我自己了,同事更是五体投地,痛哭流涕。
因为他写了几十行循环再判断再递归的代码,被我用两行代码替换了……

return $result;

mysql>SELECT CONCAT(14.3);

您可能感兴趣的文章:

  • php
    根据自增id创建唯一编号类
  • php GUID生成函数和类
  • php获取淘宝分类id示例
  • php生成随机数的三种方法
  • php使用array_rand()函数从数组中随机选择一个或多个元素
  • PHP生成不重复随机数的方法汇总
  • PHP
    n个不重复的随机数生成代码
  • PHP实现的生成唯一RequestID类完整示例

}

-> ‘14.3’

详细输出信息可查阅emlog531s数据库字典获相关文章

补充说明下:CONCAT_WS

CONCAT_WS(separator,str1,str2,…)
CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。
第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为
NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。

mysql>
SELECT CONCAT_WS(‘,’,’First name’,’Second name’,’Last Name’);

-> ‘First name,Second name,Last Name’

mysql> SELECT CONCAT_WS(‘,’,’First name’,NULL,’Last Name’);

-> ‘First name,Last Name’

CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。

例子:

首先看一下数据库表:

澳门皇冠金沙网站 1

Paste_Image.png

数据库sql:

CREATE TABLE sh_privilege (
id tinyint(3) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘id’,
pri_name varchar(15) NOT NULL COMMENT ‘权限名称’,
module_name varchar(15) NOT NULL COMMENT ‘对应的模块名称’,
controller_name varchar(15) NOT NULL COMMENT ‘对应的控制器名称’,
action_name varchar(15) NOT NULL COMMENT ‘对应的方法名称’,
parent_id tinyint(3) unsigned NOT NULL DEFAULT ‘0’ COMMENT
‘上级的id’,
pri_level tinyint(3) unsigned NOT NULL DEFAULT ‘0’ COMMENT
‘是第几级的0:顶级1:二级2:三级,用途:缩近’,
pri_path varchar(15) NOT NULL DEFAULT ‘0’ COMMENT
‘上级的路径的ID,如:0-2-6,用途:无须递归就可以实现树形结构’,
PRIMARY KEY (id),
KEY pri_path (pri_path)
) ENGINE=MyISAM AUTO_INCREMENT=18 DEFAULT CHARSET=utf8
COMMENT=’权限表’;
SQL实现无线分类的方法
SELECT id,pri_path FROM sh_privilege ORDER BY CONCAT(pri_path,‘-‘,id);

澳门皇冠金沙网站 2

Paste_Image.png

取 8
的子权限:SELECT id,pri_path FROM sh_privilege WHERE CONCAT(‘-‘,pri_path,‘-‘)LIKE ‘%-8-%’;

澳门皇冠金沙网站 3

Paste_Image.png

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图