首页 > 挨踢(IT), 数据库 > WordPress和数据库XXOO的那些SQL

WordPress和数据库XXOO的那些SQL

2012年12月26日 发表评论 阅读评论 1,290 人阅读    

  Wordpress 是一个功能非常强大、目前世界上使用最广泛的博客系统。D瓜哥的“‘地瓜哥’博客网”就是使用Wordpress搭建起来的。同时,由于D瓜哥也是搞挨踢(体面的称呼是“IT”)的,所以对Wordpress的实现很感兴趣。尤其是,安装好WP之后,只有十个表左右,更是让D瓜哥对其数据模型着迷不已啊!但是,看了Wordpress官网提供“数据库描述”,只是冰冷冷的表结构描述,很不解渴!抽空看看Wordpress和数据库时如何XXOO的?

  前天晚上,很多人都在过二人世界的时候,在这么美丽的圣诞节夜晚,D瓜哥也不落伍,在旁观WordPress和数据的XXOO!而且旁观的还很“深入细致”,直接把细节都记录下来!下面让我们来看看它们的XX日记。

  D瓜哥想,即使哥不动手,Wordpress和数据库的XXOO也可以记录的很深入细致:数据库(这里特指MySQL)应该可以有地方记录Wordpress和她XXOO的那些事。然后,D瓜哥就是用Google百度了一下,果然可以:我们可以通过MySQL的日志,来记录执行过的SQL语句。具体操作如下:

  打开MySQL的配置文件my.ini,在里面找到下面高亮的一行,然后增加一行日志记录。修改后的代码如下:

# 这行配置是配置错误日志的输出文件
log_error = "mysql_error.log"

# 下面是新增的日志文件
log = "mysql.log"

  根据D瓜哥的个人经验,有两点需要说明一下:

  1. 有些参考资料显示,日志路径可以随意配置。但是D瓜哥配置到了C盘,没有成功。所以,建议大家配置到和错误日志一样的路径即可。今天D瓜哥又想到,可能MySQL没有在C盘下的创建文件的权限吧。
  2. 如上配置的话,日志文件应该在%MySQL_HOME%\data\目录下。建议大家在这里根据配置文件中日志文件的名称,创建一个空文件。否则,MySQL会自动创建,这样可能会出现无法复制的情况。(当复制这个日志文件时,需要管理员权限;而且,在D瓜哥试验的时候,关闭数据库,这个日志文件就好自动被删除。)

  经过上面的折腾,重启一下Mysql,刷新一下Wordpress的页面,Wordpress和数据库XXOO的详情就记录在案了。然后,把日志取出来,去伪存真,就是XXOO的那些SQL了。

  然后,我们来分析一下,当我们打开一篇文章时,都会执行哪些SQL?


-- 启动时,加载一些必要的参数 
SELECT option_name, option_value 
   FROM wp_options 
   WHERE autoload = 'yes';

-- ?这个是干嘛的? 
SELECT option_value 
   FROM wp_options 
   WHERE option_name = 'widget_pages' 
   LIMIT 1;

-- ?这个又是干嘛的? 
SELECT option_value 
   FROM wp_options 
   WHERE option_name = 'widget_calendar' 
   LIMIT 1;

-- ?这个是干嘛啊? 
SELECT option_value 
   FROM wp_options 
   WHERE option_name = 'widget_nav_menu' 
   LIMIT 1;

-- 打开某一篇文章时,查询文件的内容。 
SELECT   wp_posts.* 
   FROM wp_posts  
   WHERE 1=1  
      AND wp_posts.ID = 37 
      AND wp_posts.post_type = 'post'  
   ORDER BY wp_posts.post_date DESC;

-- 查询文章对应的Tag、Category以及Post Format 
SELECT t.*, tt.*, tr.object_id 
   FROM wp_terms AS t 
   INNER JOIN wp_term_taxonomy AS tt 
      ON tt.term_id = t.term_id 
   INNER JOIN wp_term_relationships AS tr 
      ON tr.term_taxonomy_id = tt.term_taxonomy_id 
   WHERE tt.taxonomy IN ('category', 'post_tag', 'post_format') 
      AND tr.object_id IN (37) 
   ORDER BY t.name ASC;

-- 查询一个文章对应的Meta,会根据按照的插件的不同,结果有所不同。 
-- 从这里也可以看出一些插件的存储。 
SELECT post_id, meta_key, meta_value 
   FROM wp_postmeta 
   WHERE post_id IN (37);

-- 查询上一篇文章的内容,用于显示时下一篇的链接和Title。
SELECT p.* FROM wp_posts AS p  
   WHERE p.post_date < '2012-07-25 08:58:42' 
      AND p.post_type = 'post' 
      AND p.post_status = 'publish'  
ORDER BY p.post_date DESC 
LIMIT 1;

-- 查询上一篇文章的内容,用于显示时上一篇的链接和Title。
SELECT p.* 
   FROM wp_posts AS p  
   WHERE p.post_date > '2012-07-25 08:58:42' 
      AND p.post_type = 'post' 
      AND p.post_status = 'publish'  
   ORDER BY p.post_date ASC 
   LIMIT 1;

-- ?没搞清楚这个是干嘛的?!
SELECT meta_id 
   FROM wp_postmeta 
   WHERE meta_key = 'views' 
   AND post_id = 37;

-- 更新阅读次数。安装了wp-postviews才有。 
UPDATE `wp_postmeta` SET `meta_value` = '5' 
   WHERE `post_id` = 37 
      AND `meta_key` = 'views';

-- 查询需要显示的Page 
SELECT * 
   FROM wp_posts  
   WHERE (post_type = 'page' 
      AND post_status = 'publish') 
   ORDER BY menu_order ASC;

-- 查询文章的作者信息。用于显示作者名和链接。 
SELECT * FROM wp_users WHERE ID = '2';

-- 查询文章的作者信息的Meta。 
SELECT user_id, meta_key, meta_value 
   FROM wp_usermeta 
   WHERE user_id IN (2);

-- 查询文章的Meta。因为按照的插件不同,结果可能会有不同。 
SELECT post_id, meta_key, meta_value 
   FROM wp_postmeta 
   WHERE post_id IN (37);

-- 查询文章对应的评论 
SELECT * FROM wp_comments  
   WHERE comment_approved = '1' 
      AND comment_post_ID = 37 
   ORDER BY comment_date_gmt ASC;

-- ?没搞清除这个干嘛的? 
SELECT * FROM wp_users WHERE ID = '1';

-- ?没搞清除这个干嘛的? 
SELECT user_id, meta_key, meta_value 
   FROM wp_usermeta 
   WHERE user_id IN (1);

-- 查出最受欢迎的十篇文章。安装了wp-postviews,开启相应的Widget才有。
SELECT DISTINCT (meta_value+0) AS views , 
      wp_posts.*, (meta_value+0) AS views 
   FROM wp_posts 
   LEFT JOIN wp_postmeta 
      ON wp_postmeta.post_id = wp_posts.ID 
   WHERE post_date < '2012-12-24 23:42:10' 
      AND post_type = 'post' 
      AND post_status = 'publish' 
      AND meta_key = 'views' 
      AND post_password = '' 
   ORDER BY views DESC 
   LIMIT 10;

-- 查询文章的阅读次数 
SELECT meta_value 
   FROM wp_postmeta t 
   WHERE t.meta_key = 'views' 
   AND t.post_id = 37;

-- ?没搞清除这个干嘛的? 
SELECT wp_posts.ID 
   FROM wp_posts  
   WHERE 1=1  
      AND wp_posts.post_type = 'post' 
      AND (wp_posts.post_status = 'publish')  
   ORDER BY wp_posts.post_date DESC 
   LIMIT 0, 10;

-- ?没搞清除这个干嘛的? 
SELECT wp_posts.* FROM wp_posts WHERE ID IN (48);

-- 查询文章对应的Tag、Category以及Post Format 
SELECT t.*, tt.*, tr.object_id 
   FROM wp_terms AS t 
   INNER JOIN wp_term_taxonomy AS tt 
      ON tt.term_id = t.term_id 
   INNER JOIN wp_term_relationships AS tr 
      ON tr.term_taxonomy_id = tt.term_taxonomy_id 
   WHERE tt.taxonomy IN ('category', 'post_tag', 'post_format') 
      AND tr.object_id IN (48) 
   ORDER BY t.name ASC;

-- 查询文章对应的Meta 
SELECT post_id, meta_key, meta_value 
   FROM wp_postmeta 
   WHERE post_id IN (48);

-- ?这个是干嘛的? 
SELECT t.*, tt.*, tr.object_id 
   FROM wp_terms AS t 
   INNER JOIN wp_term_taxonomy AS tt 
      ON tt.term_id = t.term_id 
   INNER JOIN wp_term_relationships AS tr 
      ON tr.term_taxonomy_id = tt.term_taxonomy_id 
   WHERE tt.taxonomy IN ('category', 'post_tag', 'post_format') 
             -- 下面这些ID从何而来? 
      AND tr.object_id IN (58, 55, 49, 47, 46, 45, 39, 34)  
   ORDER BY t.name ASC;

-- ?没搞清干啥用? 
SELECT post_id, meta_key, meta_value 
   FROM wp_postmeta 
   WHERE post_id IN (58,55,49,47,46,45,39,34);

-- 查询标签云 
SELECT t.*, tt.* 
   FROM wp_terms AS t 
   INNER JOIN wp_term_taxonomy AS tt 
      ON t.term_id = tt.term_id 
   WHERE tt.taxonomy IN ('post_tag') 
      AND tt.count > 0 
   ORDER BY tt.count DESC 
   LIMIT 45;

-- 查询每个月的文章总数 
SELECT YEAR(post_date) AS `year`, 
      MONTH(post_date) AS `month`, 
      count(ID) as posts 
   FROM wp_posts  
   WHERE post_type = 'post' 
      AND post_status = 'publish' 
   GROUP BY YEAR(post_date), MONTH(post_date) 
   ORDER BY post_date DESC;

-- 查询文章分类 
SELECT t.*, tt.* 
   FROM wp_terms AS t 
   INNER JOIN wp_term_taxonomy AS tt 
      ON t.term_id = tt.term_id 
   WHERE tt.taxonomy IN ('category') 
      AND tt.count > 0 
   ORDER BY t.name ASC;

-- ?这是干嘛啊? 
SELECT YEAR(min(post_date_gmt)) AS firstyear, 
      YEAR(max(post_date_gmt)) AS lastyear 
   FROM wp_posts 
   WHERE post_date_gmt > 1970;

  从SQL的记录和我的简单解析来看,还有很多地方搞的不是很清楚,以后有机会D瓜哥会借助自己制造的Wordpress源码分析工具,再分析其源代码的实现的。敬请期待!

参考资料:

  1. 百度百科对Wordpress的介绍
  2. WordPress数据库描述
  3. mysql 的日志的启动与查看
  4. 通过日志查看mysql正在执行的SQL语句


作 者: D瓜哥,https://www.diguage.com/
原文链接:https://wordpress.diguage.com/archives/83.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。

  1. Roceys
    2012年12月27日13:59 | #1

    我喜欢。

  2. 2012年12月27日14:07 | #2

    很不错的分析文章。赞一个!!!

  3. 2013年1月5日10:05 | #3

    想写一个评论人信息的页面,接触了一下数据库。
    里面的评论信息是一个大的表。我还以为会将用户与评论内容分开。
    不知道这事为什么

    • D瓜哥
      2013年1月5日22:22 | #4

      没搞明白啥意思。其实Wordpress数据库结构整体还是比较简单的(链接、标签那块搞的还不是很清楚)。有机会交流交流。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.