MySQL递归查询树形结构的栏目

一般的栏目都是树形结构,在表结构通常会采用id、parent_id这种设计方案。比如帝国CMS的栏目也是这种方案。

查询帝国CMS一个栏目下所有的下级栏目,案例代码:

SELECT t1.classid,t1.classname,t2.classid,t2.bclassid,t2.classname,t3.classid,t3.bclassid,t3.classname,t4.classid,t4.bclassid,t4.classname
FROM phome_enewsclass t1
LEFT JOIN phome_enewsclass t2 ON t1.classid = t2.bclassid
LEFT JOIN phome_enewsclass t3 ON t2.classid = t3.bclassid
LEFT JOIN phome_enewsclass t4 ON t3.classid = t4.bclassid
WHERE t1.classid = '4968';

上述案例中,层级为四级。

解决Mysql同一个表不能同时进行update和select操作的问题

我要更改帝国CMS栏目ID=583的下级栏目模板ID,用下面SQL语句,没毛病:

UPDATE `phome_enewsclass` SET `listtempid` = 2 WHERE bclassid = 583

我要更改帝国CMS栏目ID=583的下下级栏目模板ID,用下面SQL语句:

UPDATE `phome_enewsclass` SET `listtempid` = 2 WHERE bclassid in (SELECT classid FROM `phome_enewsclass` WHERE bclassid = 583)

执行报错:#1093 - You can't specify target table 'phome_enewsclass' for update in FROM clause,意思是在同一张表上,你不能先select了再执行update操作。

改用下面SQL语句,可以修改指定栏目下的第三级栏目的模板ID:

UPDATE `phome_enewsclass` AS A INNER JOIN (SELECT classid FROM `phome_enewsclass` WHERE bclassid in(SELECT classid FROM `phome_enewsclass` WHERE bclassid = 583)) AS B ON A.classid = B.classid SET A.listtempid = 2

帝国CMS把文章移动到另外一个栏目,涉及到4张表的修改

把栏目A下的文章移动到栏目B下,以下4张表里的内容会更改:

phome_ecms_news(主表)
phome_ecms_news_data_x(这个具体要看文章在哪个副表里)
phome_ecms_news_index(索引表)
phome_enewsfile_1(信息附件分表1)

比如把栏目ID为7608的文章移动到栏目ID为7014下,SQL语句如下:

UPDATE `newfanpusoft`.`phome_ecms_news` SET `classid` = '7014' WHERE `phome_ecms_news`.`classid` = 7608;
UPDATE `newfanpusoft`.`phome_ecms_news_data_7` SET `classid` = '7014' WHERE `phome_ecms_news_data_7`.`classid` = 7608;
UPDATE `newfanpusoft`.`phome_ecms_news_index` SET `classid` = '7014' WHERE `phome_ecms_news_index`.`classid` = 7608;
UPDATE `newfanpusoft`.`phome_enewsfile_1` SET `classid` = '7014' WHERE `phome_enewsfile_1`.`classid` = 7608;

当然,文章移动了,且百度语句抓取收录了,记得做301重定向。

python调用浏览器批量打开网址

需求:网站有7000多个栏目,现在需要逐个打开检查页面显示是否异常

最笨的方法当然是人肉一个个栏目URL点击打开

python2.7脚本:

import webbrowser
import codecs
import time
with open('C:\\Users\\asus\\Desktop\\text.txt') as fp:
  for ebayno in fp:
    url = ebayno.strip()
    time.sleep(1)
    webbrowser.open(url)

注意2个问题:
1,上面txt文件是用utf-8保存的一行一个URL
2,txt文件的路劲要写对,linux和windows下路径写法肯定不一样。我第一次使用windows下调python,最开始写成C:UsersasusDesktoptext.txt,死活不对,经过群友提示,加成双斜杠就OK了。