I need the optimal SQL query in the following job. I have these tables:
host: idhost
table: idtable, idhost
reservation: idtable, start, stop
And I need those hosts which has any free table at a period (2014-03-03 12:00 - 2014-03-03 14:00).
I use this query (i'm sure this gives back right result)
SELECT idhost FROM idhost WHERE idhost NOT IN (
SELECT idhost FROM host INNER JOIN table USING (idhost) INNER JOIN reservation USING (idtable)
WHERE :start BETWEEN start AND stop OR :stop BETWEEN start AND stop OR :start < start AND stop > :stop)
But somebody said the following query is faster and gives back the same host, but I'm not sure:
SELECT * FROM host
JOIN table USING (idhost)
LEFT JOIN reservation ON reservation.idtable = table.idtable AND
:start >= reservation.start AND :stop <= reservation.stop
WHERE reservation.idtable IS NULL
Is it correct and faster? Or is there a better query?
Thank you in advance!
The following recommendations will help you in your SQL tuning process.
You'll find 3 sections below:
ALTER TABLE `idhost` ADD INDEX `idhost_idx_idhost` (`idhost`);
SELECT
idhost.idhost
FROM
idhost
WHERE
idhost.idhost NOT IN (
SELECT
idhost
FROM
((SELECT
idhost AS idhost
FROM
host
INNER JOIN
table USING (idhost)
INNER JOIN
reservation USING (idtable)
WHERE
:start < start
AND stop > :stop)
UNION
DISTINCT (SELECT
idhost AS idhost
FROM
host
INNER JOIN
table USING (idhost)
INNER JOIN
reservation USING (idtable)
WHERE
:stop BETWEEN start AND stop)
UNION
DISTINCT (SELECT
idhost AS idhost
FROM
host
INNER JOIN
table USING (idhost)
INNER JOIN
reservation USING (idtable)
WHERE
:start BETWEEN start AND stop)
) AS union1
)