欢迎各位兄弟 发布技术文章
这里的技术是共享的
思路:
第一步,创建基于用户{user}表的views;关联 {node}表;字段:用户名,(发表文章的)nid ,并对nid使用COUNT(DISTINCT)聚合计算篇数;filter node.created 并且exposed。
预览结果(发表数量为0的用户没有现实出来)
第二步,修改sql语句
分析sql语句,
from {user} u left join {node} n on n.uid=u.uid WHERE n.created = 2014-3-27。
使用left join 左表应该全部现实才对,问题出在了where 语句的使用上。
在使用left jion时,on和where条件的区别如下:
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
要想实现目标 ,需要的sql语句,应该是
from {user} u left join {node} n on n.uid=u.uid AND n.created = 2014-3-27。
创建一个模块,使用Hook_views_query_alter修改sql语句,查看hook_views_query_alter
This hook should be placed in MODULENAME.views.inc and it will be auto-loaded. MODULENAME.views.inc must be in the directory specified by the 'path' key returned by MODULENAME_views_api(), or the same directory as the .module file, if 'path' is unspecified.
开始创建模块,模块名称 mymodule
mymodule.info
name = mymodule
core = 7.x
description = ''
package = Views
-------------------------------------
mymodule.module
<?php
function mymodule_views_api(){
return array(
'api' => 3,
//(必须) views的版本,我使用的是7.x-3.7版本
//'path' => drupal_get_path('module', 'example') . '/includes/views',
//(可选) 如果文件不在模块文件根目录下,说明一下文件路径。
//'template path' => drupal_get_path('module', 'example') . '/themes',
//(可选)模板文件路径
);
}
--------------------------------------
mymodule.views.inc
<?php
//hook_views_query_alter
function mymodule_views_query_alter(&$view, &$query) {
if($view->name == "views_custom_sql" && $view->current_display == "page"){
//我创建的views 的机器名称为 views_custom_sql,这里替换
//在这里你可以对$query进行修改,使用dpm($query)
$query->table_queue['node_users']['join']->extra = array(
0=>array(
'table'=>"DATE_FORMAT(CONVERT_TZ(FROM_UNIXTIME(node_users",
'field'=>"created), 'UTC', 'Asia/Shanghai'), '%Y-%m-%d')",
'value'=>$query->where[1]['conditions'][1]['value']
)
);
unset($query->where[1]['conditions'][1]);//清除where语句中node.created的条件
//dpm($query);
}
}
修改前
修改后
在此感谢 湛江-nemo给我的多次帮助!
附件 | 尺寸 |
---|---|
模块和views导出文件 |