php+mysql 实现无限极分类

php+mysql 实现无限极分类

id        name        pid        path

1         电脑         0           0

2         手机         0           0

3         笔记本     1           0-1

4         超级本     3           0-1-3

5         游戏本     3           0-1-3

这种方式,假设我们要查询电脑下的所有后代分类,只需要一条sql语句:

select id,name from category where path like ( select concat(path,'-',id,'%') path from category where id=1 );

优点:查询容易,效率高,path字段可以加索引。

缺点:更新节点关系麻烦,需要更新所有后辈的path字段。

方案一的样例代码:

<?php

$addrs = array(

    array('id'=>1, 'name'=>'中国', 'pid'=>0),

    array('id'=>2, 'name'=>'河南', 'pid'=>1),

    array('id'=>3, 'name'=>'郑州', 'pid'=>2),

    array('id'=>4, 'name'=>'洛阳', 'pid'=>2),

    array('id'=>5, 'name'=>'安阳', 'pid'=>2),

    array('id'=>6, 'name'=>'林州', 'pid'=>5),

    array('id'=>7, 'name'=>'安阳县', 'pid'=>5),

    array('id'=>8, 'name'=>'内黄', 'pid'=>5),

    array('id'=>9, 'name'=>'滑县', 'pid'=>5),

    array('id'=>10, 'name'=>'城郊乡', 'pid'=>6),

    array('id'=>11, 'name'=>'湖南', 'pid'=>1),

    array('id'=>12, 'name'=>'长沙', 'pid'=>11),

    array('id'=>13, 'name'=>'湘潭', 'pid'=>11),

    array('id'=>14, 'name'=>'岳麓区', 'pid'=>12),

);

// 查询子树

function get_childs($id)

{

    global $addrs;

    $ret = array();

    foreach($addrs as &$addr)  // 此处使用 & 运算符,提高效率

    {

        if($addr['pid'] == $id)

        {

            $addr['children'] = get_childs($addr['id']);

            $ret[] = $addr;

        }

    }

    return $ret;

}

// test code

echo '<pre>';

print_r( get_childs(1) );

echo '<hr/>';

print_r($addrs);

mysql update获取主键

mysql update获取主键

SET @update_id := 0;
UPDATE mobantestinfo1 SET info2 = 'value', id = (SELECT @update_id := id)
WHERE info1 = '23a' LIMIT 1; 
SELECT @update_id;

大致思路就是首先声明一个用户变量 @update_id ,之后在update数据时要多更新一个字段,就是将当前主键值更新为当前主键值(其实就是没更新),更新主键字段并不是目的,只是为了将当前主键值赋值给@update_id,就是这句: ( SELECT @update_id := id )

如果是PDO只能分开运行mysql语句 变量多个用户之间是不会共享的 比如1个用户存了变量 还有个变量读取变量是为空的

mysql select自增变量(包括读取当前第几行)

mysql select自增变量(包括读取当前第几行)

SET @rownum =0;
select id,@rownum := @rownum +1 as i from ceshi order by dd desc,id desc;

变量是直接输出在结果集的

SET @rownum =0;

@rownum :=1
这2个个是变量赋值的方式

SET @rownum =0;
select i from
(select id,dd,@rownum := @rownum +1 as i from ceshi order by dd desc,id desc) as cc where id=4;
这个查询用户第几名的

不过mysql貌似没办法执行多条语句 所以看看就可以了

mysql General error: 1366 Incorrect string value: ‘\xF0\x9F\x91\x8D\xF0\x9F…’ for column ‘dianpumiaoshu’ at row 1 解决方法

mysql General error: 1366 Incorrect string value: ‘\xF0\x9F\x91\x8D\xF0\x9F…’ for column ‘dianpumiaoshu’ at row 1 解决方法

因为传入了emoji表情 曾经考虑过过滤 但是行不通 所以唯一的方法 就是urlencode后存入数据库 读取的时候再urldecode