Eu tenho uma consulta que possui uma junção cruzada e também uma junção esquerda que produz um erro
Unknown column 'a.hour' in 'on clause'
versão simplificada da consulta é assim
SELECT b.*,a.hour,c.datetime
FROM
a,b
LEFT JOIN c ON hour(c.datetime) = a.hour;
mas quando esta consulta escrita como abaixo funciona.
select f.*,c.datetime
from
(select a.Hour,b.sec FROM a, b)f
LEFT JOIN c ON hour(c.datetime) = f.hour;
até esta consulta funciona, mas o resultado não é o que eu esperava
select b.*,a.hour.c.datetime
from
a
LEFT JOIN c ON hour(c.datetime) = hrs.hour,b;
Isso parece muito estranho para mim. Alguém pode me explicar por que isso está acontecendo? Eu tentei isso no mysql 5.0 e 5.6. ambos tendo o mesmo resultado.
Abaixo está minha consulta real na qual estou trabalhando. Se parece muito grande e estranho é porque estou tentando obter uma junção externa completa sem repetir uma das consultas principais duas vezes. (União Esquerda E Direita). Hrs
tabela contém 1 a 24 e um texto como '1:00 a 2:00 Pm'.
SELECT DnT.text,IFNULL(BrowsingTime.username,upAppUsage.username) as username,dDate,
IFNULL(BrowsingTime.wDay,upAppUsage.wDay) as wDay,
productive,
unProductive,
Total,
Game,
Chat,
Video
FROM
(
SELECT hrs.hour,hrs.text,dates.dDate
FROM
hrs,
-- ALL THE user,DATE WITH REPORT
(
SELECT date(surfDateTime) as dDate,userid
FROM browsingtime
WHERE
DATE(surfDateTime) BETWEEN '2013-10-01' AND '2015-10-10'
GROUP BY dDate,userid
UNION
SELECT date(snapshotDateTime)as dDate,userid
FROM AppUsage_user_hour
WHERE
DATE(snapshotDateTime) BETWEEN '2013-10-01' AND '2015-10-10'
GROUP BY dDate,userid
)dates
) AS DnT
LEFT JOIN
-- USER BROWSING TIME PER HOUR PER DATE
(
SELECT rb.userId,CONCAT('(',user.id,') ',user.username) AS username,
date(surfDateTime) surfdate, HOUR(surfDateTime)as hr,DAYNAME(surfDateTime) AS wDay,
SUM(IF(up.isProductive = 1,rb.duration,0)) as productive ,
SUM(IF(up.isProductive = 0,rb.duration,0)) as unProductive,
SUM(rb.duration) as Total
FROM `user`
INNER JOIN usergroup ON usergroup.id = `user`.userGroupId
INNER JOIN browsingtime rb ON `user`.id = rb.userId
LEFT OUTER JOIN url_productive up ON up.urlshortid = rb.urlShortId
WHERE
DATE(surfDateTime) BETWEEN '2013-10-01' AND '2015-10-10'
AND user.userGroupId IN (1,2,3,4,5,6,7,8,9,10)
GROUP BY surfdate, hr,rb.userId
)as BrowsingTime ON DnT.hour = BrowsingTime.hr AND BrowsingTime.surfdate = DnT.dDate AND DnT.userId = BrowsingTime.userId
LEFT JOIN
-- APPLICATION USAGE
(
SELECT r.userId,CONCAT('(',u.id,') ',u.username) AS username,
date(r.snapshotDateTime)as usageDate, HOUR(r.snapshotDateTime)as hr,DAYNAME(r.snapshotDateTime) AS wDay,
SUM(IF(sl.categoryId = 2 , softwareActiveTime,0)) as Game ,
SUM(IF(sl.categoryId = 9 , softwareActiveTime,0)) as chat ,
SUM(IF(sl.categoryId = 8 , softwareActiveTime,0)) as video
FROM AppUsage_user_hour r
INNER JOIN USER u ON u.id = r.userId
INNER JOIN usergroup ON usergroup.id = u.userGroupId
INNER JOIN clientpc cp ON cp.id = r.pcId
INNER JOIN softwares sl ON sl.id = r.softwareId
WHERE sl.categoryId IN (2,8,9)
AND DATE(r.snapshotDateTime) BETWEEN '2013-10-01' AND '2015-10-10'
GROUP BY usageDate,r.userId
)as upAppUsage ON DnT.hour = upAppUsage.hr AND upAppUsage.usageDate = DnT.dDate AND DnT.userId = upAppUsage.userid
WHERE
IFNULL(BrowsingTime.userId,upAppUsage.userId) IS NOT NULL;