首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL需要提高运行速度

SQL需要提高运行速度
EN

Stack Overflow用户
提问于 2017-12-12 15:42:43
回答 3查看 100关注 0票数 1

我试图通过数据库中的日期字段从mysql中选择数据。(用户可以输入开始日期和结束日期)

对于用户选定日期之间的每一行,我需要从相同的表中进行选择,以生成结果。

示例:

代码语言:javascript
复制
    $query = "SELECT * FROM table WHERE date BETWEEN $begindate AND $enddate"; //Select by date
    $result = mysqli_query($dbc,$query);
    while($row = mysqli_fetch_array($result)){
        vardump($row); //user needs to see all data between date selection
        $query = "SELECT * FROM table WHERE field = $row['field']";
        // and then do calculations with the data
    }

它运行得很慢,我明白原因了。如何提高跑步速度?

编辑:最初的目的是在日期之间生成销售报告。现在,用户希望报表产生另一个结果。只能通过对同一表进行搜索才能产生此结果,而且我所需的行不在日期选择范围内。

编辑2:我确实需要在日期选择之间输出整个表。每一行都需要在日期选择的内部或外部查找field = field的所有其他行。

编辑3:解决了问题。所有的答案都是有帮助的,尽管我认为选择的答案与我的问题最相关。但是,我相信在使用两个表时使用join是正确的方法。对于我的问题,我实际上只是通过复制表来解决它,并在复制的表上运行搜索。所选答案对我无效,因为第二个查询选择不是第一个查询选择的一部分。希望这能帮到看这篇文章的人。再次感谢你的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-12 15:59:41

那么,如果您真的要在相同的表中寻找这样的条件,我建议您应该使用IN选择器,如下所示:

代码语言:javascript
复制
$query = "SELECT * FROM table 
           WHERE field IN 
               (SELECT DISTINCT field FROM table 
                WHERE 
                    date BETWEEN $begindate AND $enddate)";

因此,最终代码如下所示:

代码语言:javascript
复制
    $query = "SELECT * FROM table 
           WHERE field IN 
               (SELECT DISTINCT field FROM table 
                WHERE 
                    date BETWEEN $begindate AND $enddate)";
    $result = mysqli_query($dbc,$query);
    while($row = mysqli_fetch_array($result)){
        // do calculations with the $row
    }
票数 2
EN

Stack Overflow用户

发布于 2017-12-12 15:52:55

我想你的表名不是TABLE

只有用户inner join

代码语言:javascript
复制
 $query = "SELECT * 
           FROM table1
           JOIN table2 
             ON table1.field = table2.field
           WHERE date BETWEEN $begindate AND $enddate
           ORDER BY table1.field;"
票数 1
EN

Stack Overflow用户

发布于 2017-12-12 16:01:06

停止编写伪SQL。

SELECT * FROM在技术上是伪sql (解释器在执行命令之前必须修改的一个sql命令)。最好养成语句的习惯。

使用SQL联接

连接使关系数据库变得非常有用和强大。学习他们。我爱他们。

将您的一组SQL查询组合成一个查询:

代码语言:javascript
复制
SELECT 
    table1.id as Aid, table1.name as Aname, table1.field as Afield,
    table2.id as Bid, table2.name as Bname, table2.field 
FROM table table1
LEFT JOIN table table2 
    ON table1.field = table2.field
WHERE table1.date BETWEEN $begindate AND $enddate
ORDER BY table1.id, table2.id

由此产生的数据打印结果应该会导致访问每一组数据的结果,类似于:

代码语言:javascript
复制
$previous_table1_id = 0;
while($row = mysqli_fetch_array($result)){
    if ($row['Aid'] != $previous_table1_id) {
        echo 'Table1: ' . $row['Aid'] . ' - ' . $row['Aname'] . ' - '. $row['Afield'] . "\n";
        $previous_table1_id = $row['Aid'];
    }

    echo 'Table2: ' . $row['Bid'] . ' - ' . $row['Bname'];
}

处理聚合数据

数据聚合(表1/表2在field上的多个匹配)是一个复杂的主题,但要了解它很重要。现在,我把这个留给你:

下面是一个简单的示例,说明聚合数据是什么,以及使用它的无数方法之一。

代码语言:javascript
复制
Contents of Table
id |  name  |  field
--------------------
1  |  foos  |  whoag 
2  |  doh   |  whoag
3  |  rah   |  whoag
4  |  fun   |  wat
5  |  ish   |  wat

Result of query I gave you
Aid | Aname | Afield | Bid | Bname
----------------------------------
1   | foos  | whoag  | 1   | foos
1   | foos  | whoag  | 2   | doh
1   | foos  | whoag  | 3   | rah
2   | doh   | whoag  | 1   | foos
2   | doh   | whoag  | 2   | doh
2   | doh   | whoag  | 3   | rah
3   | rah   | whoag  | 1   | foos
3   | rah   | whoag  | 2   | doh
3   | rah   | whoag  | 3   | rah
4   | fun   | wat    | 4   | fun
4   | fun   | wat    | 5   | ish
5   | ish   | wat    | 4   | fun
5   | ish   | wat    | 5   | ish

按收缩结果集的示例分组

代码语言:javascript
复制
    SELECT table1.id as Aid, table1.name as Aname
           group_concat(table2.name) as field
    FROM table table1
    LEFT JOIN table table2 
        ON table1.field = table2.field
    WHERE table1.date BETWEEN $begindate AND $enddate
    ORDER BY table1.id, table2.id
    GROUP BY Aid

Aid | Aname | field
----------------------------------
1   | foos  | foos,doh,rah
2   | doh   | foos,doh,rah
3   | rah   | foos,doh,rah
4   | fun   | fun, ish
5   | ish   | fun, ish
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47776376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档