MYSQL PHP查询已查询的数据(过滤已过滤的数据)


MYSQL PHP querying already queried data ( Filtering already filtered data)

我有一个返回超过30,000条记录的复杂查询。我们每次向用户显示100条记录,用户必须单击next以获取下100条记录。

这里的问题是我们再次对数据库运行复杂的查询,并添加LIMIT 100,200来获取接下来的100条记录。

除了这种复杂性,我们在客户端还有其他过滤器,必须在30,000条记录上执行,数据库中大约有100,000个用户。因此,对于每个活动,我们都要一次又一次地运行这个复杂的查询。

是否有办法保存这30,000条记录并在其上运行操作?我检查了临时MYSQL表。但我不认为我们可以在这种情况下使用它们。为了将数据存储在物理表中并对其进行查询,如果1000个用户同时尝试访问这个未来,并以编程方式处理它(插入和删除操作),那将是一场大混乱

更新以提供更多细节

->下面是一个确切的场景,Cars公司想要查看给定距离内的所有汽车,例如距离给定经纬度100英里半径内的汽车和用户详细信息。完成此操作后,在combox中显示汽车模型,并在该数据表下方显示所有信息。同样,在每一列的顶部有一个用于搜索该列的文本字段(例如,在客户名称上输入两个字母,开始过滤数据)。1) 100英里以内的城市2)查询数据库(这里合并5个表)3)从上述查询中获取汽车型号列表,并显示在列表框中4)向用户显示这100条记录5)基于copbox框列表和每列

上的文本字段进行过滤

这么简单:)——>

谢谢你的帮助

Kiran

我公司的应用程序处理超过200万条记录和许多连接,我们使用jQuery datattables非常优雅地处理了这个问题。是的,这就是前端技术....但是用户、数据表和查询之间的交互使它成为一个真正优雅的解决方案。除了索引表之外,我们根本不做任何视图或存储过程,而且它的工作非常快捷。

DataTables是一个网格——一个具有额外功能的表,包括排序、分页、过滤等。它通过Ajax每次抓取X个数据,并向查询添加额外的元素以实现额外的功能。它真正的亮点是当你使用一个叫做"流水线"的功能时,它可以在你显示的内容之前和之后抓取数据,减少查询量,同时给用户一个更快的观看体验。这是一个内置功能,非常容易部署。

下面是关于管道的图:http://datatables.net/examples/server_side/pipeline.html

下面是我使用的查询示例:

public static function getQueue( $q=false) {
            $connect = new db_connection();
            $query  = ' SELECT something
                                    FROM table
                        WHERE 1 ';
            if ($q['id']) {
                $query .= " AND id = ".$q['id']." ";
            }
            if ($q['sortOrder']) {
                $query .= "ORDER BY " . $q['sortField']. " " .$q['sortOrder']. " ";
            }
            if ($q['limit']) {
                $query .= ' LIMIT '.$q['limit'];
            }
            if ($q['offset']) {
                $query .= ' OFFSET '.$q['offset'];
            }
            $result = $connect->query($query);
            $queue_array = $connect->fetchAll($result);
            return $queue_array;
        }

如果你以前从未使用过Jquery Ajax,它会在字符串中寻找结果。因此,我有一个页面,它调用下面的函数和上面的查询来回显结果。我把它叫做ajaxDispatcher:

public static function showQueue($info) {
            $q['limit'] = $info['iDisplayLength'];
            $q['offset'] = $info['iDisplayStart'];
            //Ordering
            if ( isset( $info['iSortCol_0'] ) )  {
              for ( $i=0 ; $i < $info['iSortingCols']; $i++ ) {
                  $q['sortField'] .= self::queueHeaders($info['iSortCol_'.$i]);
                  $q['sortOrder'] .= $info['sSortDir_'.$i];
              }
            }
            $callqueue = self::getQueue($q);                    //Gets results with dependencies
            $prospect_count = self::getCount();                 //Gets total record count
            $string = '{"sEcho": '.intval($_REQUEST['sEcho']).', "iTotalRecords": '.intval($prospect_count).', "iTotalDisplayRecords": '.(int)$prospect_count.', "aaData":[';

            foreach ($callqueue as $c ) {
                $locked = ($c['locked'] == 1)?'<input type="checkbox" checked disabled>':'<input type="checkbox" disabled>';
                $scheduled_date = ($c['callback_date_time'])?date("M d Y g:ia", strtotime($c['callback_date_time'])):'';
                if ($count != 0)  $midstring .= "," ;
                $midstring .= '["'.$c['priority'].'", "'.addslashes($locked).'", "'.$scheduled_date.'", "'.$c['company_name'].'", "'.$c['marcom_name'].'", "'.$c['marcom_description'].'"]';
                $count++;
            }
            $endstring .= ']}';
            $finalstring = $string.$midstring.$endstring;
            return $finalstring;
     }

这个工具对我们公司来说是一个改变游戏规则的工具。我们从一个(设计糟糕的)手动分页系统转向了ajax调用和交互性,这对用户体验产生了巨大的影响。在某种程度上,您是在通过查询和交互....的间距"欺骗"用户

我可以推荐以下方法来处理多次数据搜索。

当用户第一次搜索时,查询记录的id,匹配他的所有过滤器。然后,每次需要呈现页面时,使用limit子句查询数据库中具有这些id的记录。这将显著降低数据库负载,因为您不需要一次又一次地应用过滤器,只需根据主键选择记录。