通过提高效率来减少多个MySQL查询

时间:2017-05-23 06:04:37

标签: mysql

美好的一天!

我想知道是否有人可以建议我所做的事情是否完全没效率 - 我希望它是 - 并且可能建议我应该如何提高效率!

我从PHP表中提取数据并将其显示在表格中。 表的行与用户相关,列是在两个日期之间出现的一个表字段中的条目数。

我有30个日期范围,因此有30列。

我目前有一个带有日期范围的12/03/2017 00:00:00 - 18/03/2017 23:59:59 followed by 24/03/2017 00:00:00 - 30/03/2017 23:59:59 数组,每次循环到下一个表格单元格时,我都会使用新的日期范围运行MySQL查询。每个用户执行此操作30次似乎效率低下。有没有办法可以在一个查询中完全解决这个问题?日期范围并不总是连续几周。我可能有一个

    SELECT * FROM `wwlassessments` WHERE `assessedBy`='STAFF NAME' && `dateAchieved`
    BETWEEN '2017-05-10 00:00:00' AND '2017-05-16 23:59:59'

也许有办法传递日期范围列表并在1个查询中收回结果?或者是我正在做的正确的方式,但只是缓慢?

这是我当前循环插入不同日期的查询示例。

string fromAddress ="doctor@gmail.com";    
string fromPassword = "idntcare";        
string toAddress = "thevarghese@gmail.com"; 
using (MailMessage mm = new MailMessage(fromAddress, toAddress))
    {
        mm.Subject = subject;
        mm.Body = body;

        //attachment
        if (fuAttachment.HasFile)
        {
            string FileName = Path.GetFileName(fuAttachment.PostedFile.FileName);
            mm.Attachments.Add(new Attachment(fuAttachment.PostedFile.InputStream, FileName));
        }
        mm.IsBodyHtml = true;

        System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient();

        smtp.Host = "smtp.gmail.com";
        smtp.EnableSsl = true;

        NetworkCredential NetworkCred = new NetworkCredential(email, password);
        smtp.UseDefaultCredentials = true;
        smtp.Credentials = NetworkCred;
        smtp.Port = 587;
        //smtp.Port = 25;
        smtp.Send(mm);
        ClientScript.RegisterStartupScript(GetType(), "alert", "alert('Email sent.');", true);
    }

感谢您的任何建议。 千斤顶

2 个答案:

答案 0 :(得分:0)

试试这个:

SELECT * 
FROM `wwlassessments` 
WHERE `assessedBy`='STAFF NAME' 
    && (`dateAchieved` BETWEEN '2017-05-10 00:00:00' AND '2017-05-16 23:59:59' 
         || `dateAchieved` BETWEEN '2017-05-19 00:00:00' AND '2017-05-24 23:59:59') 

您也可以在php中进行一些预先检查,以防止重复的日期范围。

答案 1 :(得分:0)

试一试:

SELECT * 
  FROM wwlassessments
 WHERE assessedBy = 'STAFF NAME' 
   AND dateAchieved BETWEEN '2017-05-10 00:00:00' AND '2017-05-16 23:59:59' 
 UNION ALL
SELECT * 
  FROM wwlassessments
 WHERE assessedBy = 'STAFF NAME' 
   AND dateAchieved BETWEEN '2017-05-24 00:00:00' AND '2017-05-30 23:59:59'

SELECT * 
  FROM wwlassessments 
 WHERE assessedBy = 'STAFF NAME' 
   AND (dateAchieved BETWEEN '2017-05-10 00:00:00' AND '2017-05-16 23:59:59' 
     OR dateAchieved BETWEEN '2017-05-24 00:00:00' AND '2017-05-30 23:59:59')