Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按天分组查询的数据并将其布置到网格中_Php_Mysql_Codeigniter_Grid - Fatal编程技术网

Php 按天分组查询的数据并将其布置到网格中

Php 按天分组查询的数据并将其布置到网格中,php,mysql,codeigniter,grid,Php,Mysql,Codeigniter,Grid,我有一个社交网络日志项目,让用户输入他们一整天做的任何活动 在我的数据库中,我有一个“logs”表,其中包含以下字段: | log_id | log_content | log_date | log_author | 我的问题是,如何执行一个查询,该查询将获取前n天的数据,然后在网格视图中显示其结果,如下所示: | Monday, December 7, 2013 | log_content, log_author, 6 AM | log_content, log_author, 8:30 A

我有一个社交网络日志项目,让用户输入他们一整天做的任何活动

在我的数据库中,我有一个“logs”表,其中包含以下字段:

| log_id | log_content | log_date | log_author |
我的问题是,如何执行一个查询,该查询将获取前n天的数据,然后在网格视图中显示其结果,如下所示:

| Monday, December 7, 2013
| log_content, log_author, 6 AM | log_content, log_author, 8:30 AM | ...|

| Tuesday, December 8, 2013
| log_content, log_author, 7:10 AM | log_content, log_author, 12:00 NN | log...|

| Wednesday, December 9, 2013
| log_content, log_author, 6:30 PM |

| Thursday, December 10, 2013
| log_content, log_author, 9:53 AM | log_content, log_author, 4:02 PM | ...|

| Friday, December 11, 2013
| log_content, log_author, 1:34 PM |
function fetch_logs($group_id, $limit, $offset){
        $this->db->select('l.log_id, l.log_date, l.log_content, u.username');
        $this->db->from('logs AS l');
        $this->db->join('log_group_ref AS r', 'l.log_id = r.log_id');
        $this->db->join('users AS u', 'l.log_author = u.user_id');
        $this->db->where('r.group_id', $group_id);
        $this->db->limit($limit, $offset);
        return $this->db->get()->result_array();
    }
我知道我不能查询整个“logs”表,因为当日志增长时,它会导致瓶颈。我正在考虑以位为单位进行查询,当用户向下滚动时,另一个后台查询将运行以显示下一组数据(使用限制和偏移)

目前我的查询如下所示:

| Monday, December 7, 2013
| log_content, log_author, 6 AM | log_content, log_author, 8:30 AM | ...|

| Tuesday, December 8, 2013
| log_content, log_author, 7:10 AM | log_content, log_author, 12:00 NN | log...|

| Wednesday, December 9, 2013
| log_content, log_author, 6:30 PM |

| Thursday, December 10, 2013
| log_content, log_author, 9:53 AM | log_content, log_author, 4:02 PM | ...|

| Friday, December 11, 2013
| log_content, log_author, 1:34 PM |
function fetch_logs($group_id, $limit, $offset){
        $this->db->select('l.log_id, l.log_date, l.log_content, u.username');
        $this->db->from('logs AS l');
        $this->db->join('log_group_ref AS r', 'l.log_id = r.log_id');
        $this->db->join('users AS u', 'l.log_author = u.user_id');
        $this->db->where('r.group_id', $group_id);
        $this->db->limit($limit, $offset);
        return $this->db->get()->result_array();
    }
但我不知道如何将查询的数据按天分组,并将它们放入网格中

我将Twitter的引导程序与网格一起使用,这样我就可以很好地将每个日志放到一个网格中,如果有更多日志,只需添加滚动条即可

更新:

因此,我根据raheel shan的第二种方法更新了代码,但在添加以下内容之前,我似乎无法获得所需的数据:

$this->db->group_by(l.log_date);
基于Exander的代码,该代码获取正确的数据集,尽管格式与raheel shan的不同

在这两个问题中,以下是我的最新查询:

$select =   array(
                            "DATE_FORMAT(l.log_date,'%a , %b %d , %Y') AS LogDate",
                            "GROUP_CONCAT(l.log_id) AS LogIDs",
                            "GROUP_CONCAT(l.log_content) AS LogContents",
                            "GROUP_CONCAT(u.username) AS LogAuthors",
                            "GROUP_CONCAT(DATE_FORMAT(l.log_date,'%h:%i %p')) AS LogTimes"
                        );
            $this->db->select($select);
            $this->db->from('logs AS l');
            $this->db->join('log_group_ref AS r', 'l.log_id = r.log_id');
            $this->db->join('users AS u', 'l.log_author = u.user_id');
            $this->db->where('r.group_id', $group_id);
            $this->db->group_by('l.log_date');
            $this->db->limit($limit, $offset);
            return $this->db->get()->result_array();
现在,我必须处理分解每个日志内容、日志作者、日志时间,并将它们重新分组到数组中。我需要再次学习raheel shan的代码

更新: 我终于得到了实现这一目标所需要的一切。我会将raheel shan的标记为已接受,因为我只能接受一个。虽然Exander的代码也是正确的,加上较少的代码,这使它变得很棒。

你可以试试这个--

我刚刚格式化了日期(l.log_date)并添加了order_by子句,这样它就可以获取前N天的活动。

下面是如何实现的。 查看演示

在Codeigniter中

$query  ="  SELECT
                DATE_FORMAT(l.log_date,'%a , %b %d , %Y') as LogDate,
                DATE(l.log_date) as LDate,
                GROUP_CONCAT(r.data) as LogData
            FROM logs as l
            INNER JOIN  (
                        SELECT 
                                logs.log_date,
                                GROUP_CONCAT(other) as data     
                        FROM logs
                        LEFT JOIN (
                                    SELECT 
                                        log_date,
                                        CONCAT(log_content, ' | ', log_author , ' | ' , DATE_FORMAT(log_date,'%h:%i %p')) as other 
                                    FROM logs
                                    GROUP BY log_date
                        ) as t ON t.log_date = logs.log_date
                        GROUP BY log_date
            ) as r ON r.log_date = l.log_date
            GROUP BY LDate";

$result =   $this->db->query($query);
return $result->result();
学习点

左连接
小组讨论
康卡特
日期格式

编辑:
第二种方法

如果你想用php做这件事很容易。这是你可以做到的。第一模型函数

function fetch_logs($group_id, $limit, $offset)
{
        $select =   array(
                        "DATE_FORMAT(l.log_date,'%a , %b %d , %Y') as LogDate",
                        "GROUP_CONCAT(l.log_id) as LogIDs",
                        "GROUP_CONCAT(l.log_content) as LogContents",
                        "GROUP_CONCAT(l.log_author) as LogAuthors",
                        "GROUP_CONCAT(DATE_FORMAT(l.log_date,'%h:%i %p')) LogTimes"
                    );
        $this->db->select($select);
        $this->db->from('logs AS l');
        $this->db->join('log_group_ref AS r', 'l.log_id = r.log_id');
        $this->db->join('users AS u', 'l.log_author = u.user_id');
        $this->db->where('r.group_id', $group_id);
        $this->db->group_by(l.log_date);
        $this->db->limit($limit, $offset);
        return $this->db->get()->result_array();
}   
现在是控制器功能

function getLogs()
{
    $result =   $this->yourmodel->fetch_logs();
    $data   =   array();
    $i  =   0;

    foreach($result as $row)
    {
        $logids     =   explode(',',$row['LogIDs']);
        $logcontents    =   explode(',',$row['LogContents']);
        $logauthors =   explode(',',$row['LogAuthors']);
        $logtimes       =   explode(',',$row['LogTimes']);

        $counter    =   count($logids);
        $test   =   array();

            for($j=0;$j<$counter;$j++)
            {
                $test[] =   $logcontents[$j] .','. $logauthors[$j] .','.$logtimes[$j];
            }
        $data[$i]['logdata']    =   implode('|',$test);
        $data[$i]['logdate']    =   $row['LogDate'];
        unset($test);
        $i++;
    }

    $viewdata['data']   =   $data;
    $this->load->view('my_view',$viewdata);
}
函数getLogs() { $result=$this->yourmodel->fetch_logs(); $data=array(); $i=0; foreach($结果为$行) { $logids=explode(“,”,$row['logids']); $logcontents=explode(“,”,$row['logcontents']); $logauthors=explode(“,”,$row['logauthors']); $logtimes=explode(',',$row['logtimes']); $counter=计数($logids); $test=array(); 对于($j=0;$jload->view($my_view’,$viewdata); }
我不完全确定,但此查询似乎能够在不使用任何子查询的情况下获得所需的结果:

SELECT
    DATE_FORMAT(l.log_date,'%W , %M %d , %Y') AS day,
    GROUP_CONCAT(l.log_content, ', ', u.username, ', ', DATE_FORMAT(l.log_date, '%l:%i %p') ORDER BY l.log_date SEPARATOR ' | ') AS activity
FROM logs as l
INNER JOIN users u ON u.user_id = l.log_author
INNER JOIN log_group_ref r ON r.log_id = l.log_id
WHERE r.group_id = **<YOUR_GROUP_ID>**
GROUP BY DATE(l.log_date) ASC;
选择
日期格式(l.log_日期,'%W,%M%d,%Y')作为日期,
按l.log_日期分隔符“|”排序的组目录(l.log_内容“,”,u.username“,”,日期格式(l.log_日期“,%l:%i%p')作为活动
从日志中删除为l
u.user\u id=l.log\u作者上的内部加入用户u
内部连接日志\u组\u ref r ON r.log\u id=l.log\u id
其中r.group_id=****
按日期分组(l.log\U DATE)ASC;

您可以看到示例(部分复制并粘贴自raheel shan的示例).

请解释您的输出您真正想要的。@raheelshan,最终的输出应该与我上面描述的一样。一天可以包含任意数量的日志,并显示在一行中。另一天将是另一行。某一天的每个日志都排列在一个网格中,以便我可以选择显示所有天的5个日志网格,并隐藏t他休息,只需使用滚动条显示隐藏的日志,这样一切都会变得整洁。类似这样:我遇到了一个分析错误:语法错误,在C:\xampp中出现意外“%”(可能只是引号问题)但无论如何,正如我所理解的,它应该以降序的顺序返回前5天的数据数组。但是,我将如何在php端处理它,以便我能够识别此日志属于这一天,并且应该在这一行中…此日志在那一天,并且应该在那一行中?我真的很困惑。感谢您的回复!Thanks对于这项工作,我发现您需要在select部分添加false作为第二个参数以避免错误。另外,我想知道date_格式之后的D是什么?根据演示,我认为您已经达到了我想要的效果。我原以为数据的放置将由PHP完成,我从未想过这一切都可以在SQL中完成。现在我将我必须明白这一点(希望我能)并测试是否可以创建最终输出。还有其他方法吗?查询看起来非常复杂。但是,真的,谢谢!最佳实践是从查询中获取所有内容,这样您就不必在php端执行很多条件和循环。此查询并不复杂。如果您学会使用派生查询,您可以执行任何操作。这个gives您可以在php和上编写更少的代码。否则,您可能必须在php中使用多个循环。@Zaski请参阅我回答中编辑的部分好的,我已经尝试了第一个循环并使其正常工作,但我无法处理连接的输出(日志数据)这样我就可以将每个日志放在一个网格中。我能想到的唯一方法是拆分每个返回的日志数据以获得单独的日志。有没有办法让日志数据的输出不是一个concat而是一个数组?我还将尝试你的第二种方法,该方法似乎解决了我的第二个问题..但不是完全确定的。再次感谢!如果你使用php explode您将以array@Extander!你的技术真的使查询最小化了。我从来都不知道我们可以使用组_concat这样使用concat。所以你应该得到+1。@Extander,这确实更好!给你另一个+1。谢谢你的洞察力。