Solved

sql

Posted on 2011-09-24
9
235 Views
Last Modified: 2012-05-12
how can I rewrite / optimize the following query to execute faster:

SELECT count( 1 ) AS ct
FROM myTable
WHERE email =' test@test.com'
AND substr(submitdate, 1, 10 ) = substr( now( ) , 1, 10 )

I basically want it to search through today's matching records only rather than all matching records. I already created a combined index (ALTER TABLE `myTable`
ADD INDEX `newindex` (`submitdate`, `email`) ) but not sure what to do after that.  When I do an EXPLAIN, it seems to be searching all rows with matching email (regardless of date) - rather than just rows with submitdate of today. ??

thanks in advance for your help...
0
Comment
Question by:web5dev7
  • 5
  • 4
9 Comments
 
LVL 52

Expert Comment

by:_agx_
Comment Utility
When possible, avoid using functions on columns because it can prevent the db from using your index. But you don't need substr() to find records for a single date. Just use

SELECT count(*) AS ct
FROM    myTable
WHERE  email =' test@test.com'
WHERE  submitdate >= curDate()                
AND       submitdate <  DATE_ADD(curDate(), INTERVAL 1 DAY)  

0
 
LVL 52

Expert Comment

by:_agx_
Comment Utility
> WHERE  submitdate >= curDate()                
> AND       submitdate <  DATE_ADD(curDate(), INTERVAL 1 DAY)  

ie
WHERE  submitdate >= '2011-09-24'      --- today at midnight
AND       submitdate <  '2011-09-25'       --- tomorrow at midnight

... which essentially says find all records with today's date
0
 

Author Comment

by:web5dev7
Comment Utility
ok, but just to clarify, this is part of a php form validation to prevent a user from submitting a form more than once per day - so I wanted it to check for the existence of his email address in all pre-existing records with a submitdate of today.  But, for efficiency sake, not have it look at all records, only today's. The dates in the db table are formatted like: 2011-09-24 15:35:15   so we don't want the time to mess it up, right ?  
0
 
LVL 52

Expert Comment

by:_agx_
Comment Utility
Did you test the query? Because time isn't an issue. That's another way of saying find all records with today's date regardless of the time .  ie any time between 12 midnight and 11:59:59PM

      WHERE  submitdate >= '2011-09-24'      --- today at midnight
      AND       submitdate <  '2011-09-25'       --- tomorrow at midnight



0
Complete VMware vSphere® ESX(i) & Hyper-V Backup

Capture your entire system, including the host, with patented disk imaging integrated with VMware VADP / Microsoft VSS and RCT. RTOs is as low as 15 seconds with Acronis Active Restore™. You can enjoy unlimited P2V/V2V migrations from any source (even from a different hypervisor)

 

Author Comment

by:web5dev7
Comment Utility
phpMyAdmin gives me back the following error:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near:
WHERE  submitdate >= curDate()                
AND       submitdate <  DATE_ADD(curD'
at line 4
0
 
LVL 52

Accepted Solution

by:
_agx_ earned 250 total points
Comment Utility
My bad.  Copy paste error in the sql. Try this:

SELECT count(*) AS ct
FROM    myTable
WHERE  email =' test@test.com'
AND       submitdate >= curDate()                
AND       submitdate <  DATE_ADD(curDate(), INTERVAL 1 DAY)  

0
 

Author Comment

by:web5dev7
Comment Utility
great that works in phpMyAdmin.  How could I write that in a secure way in my php select statement?  This is what phpMyAdmin gave me:

"SELECT count(*) AS ct\n"
    "FROM myTable\n"
    "WHERE email =\'$email\'\n"
    "AND submitdate >= curDate() \n"
    "AND submitdate < DATE_ADD(curDate(), INTERVAL 1 DAY)";

Do I have to do something with "mysql_real_escape_string" for security ?
Do I need the \n ? (what are those?)

0
 
LVL 52

Expert Comment

by:_agx_
Comment Utility
Sorry, I'm not a php expert :(  As I think we've answered the original question, it's probably best to open a new thread about the sql injection question.  

http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/PHP/PHP_Databases/A_686-PHP-Prevent-SQL-Injection.html
0
 

Author Comment

by:web5dev7
Comment Utility
ok, will do, thanks for your help.
0

Featured Post

What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
Access Join Query 12 47
Mysql not caching queries 4 45
Access Query concatenation 12 45
SQL Server R2 Stored procedure make faster 7 31
Confronted with some SQL you don't know can be a daunting task. It can be even more daunting if that SQL carries some of the old secret codes used in the Ye Olde query syntax, such as: (+)     as used in Oracle;     *=     =*    as used in Sybase …
Occasionally there is a need to clean table columns, especially if you have inherited legacy data. There are obviously many ways to accomplish that, including elaborate UPDATE queries with anywhere from one to numerous REPLACE functions (even within…
Sending a Secure fax is easy with eFax Corporate (http://www.enterprise.efax.com). First, Just open a new email message.  In the To field, type your recipient's fax number @efaxsend.com. You can even send a secure international fax — just include t…
This video discusses moving either the default database or any database to a new volume.

763 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

9 Experts available now in Live!

Get 1:1 Help Now