2013-03-19 96 views
3

我刚刚继承了一个代码库,并且存在一个不正确的现有查询。它看起来像(泛型化表这里&列):Mysql - 2个计数在一个查询中,第二个计数结果不好

select p.user_id, p.photo_id, p.date, count(p.photo_id) as 'Photos', count(v.photo_id) as 'Views' 
from photos p 
LEFT OUTER JOIN userviews v on v.user_id = p.user_id and v.photo_id = p.photo_id 
where p.photo_id in (1,2,3 [...]) 
GROUP BY photo_id, user_id 
ORDER BY user_id, photo_id 

结果集是接近正确,如此接近,没有人注意到这是错误的一段时间。

如果表2(用户视图)中没有数据,则生成的行是正确的。

但是,如果有数据在那里,结果集从表1中重复计数值,即:

1082 3381 2012-05-25 08:50:20 3 3 <--WRONG, should be 1 
1082 3387 2012-07-26 15:02:36 2 2 <--WRONG, should be 4 
1117 3381 2012-05-23 03:46:02 1 0 <--CORRECT 
1117 3382 2012-05-23 03:45:54 1 0 <--CORRECT 
1117 3383 2012-05-23 03:45:09 1 0 <--CORRECT 

现在,如果这是SQL服务器,我用刚刚改写该死的东西CTE,但Mysql不支持WITH子句,并且我不认为我可以通过子查询来返回多个值。

那么我该如何解决这个问题呢?在此先感谢,我难住这一个。当你不GROUP BY

+1

你可以发布一些未聚合的示例数据吗? – Rachcha 2013-03-19 05:49:46

回答

1

尝试此查询

SELECT p.user_id, p.photo_id, p.Photos, ph.date, v.Views 
FROM photos ph, 
     (SELECT p.user_id, p.photo_id, count(p.photo_id) as 'Photos' 
     FROM photos p 
     WHERE p.photo_id in (1,2,3 [...]) 
     GROUP BY p.photo_id, p.user_id) p, 
    (SELECT v.user_id, v.photo_id, count(v.photo_id) as 'Views' 
     FROM userviews v 
     WHERE v.photo_id in (1,2,3 [...]) 
     GROUP BY v.photo_id, v.user_id 
    ) v 
WHERE p.user_id = v.user_id AND 
     p.photo_id = v.photo_id AND 
     ph.photo_id = p.photo_id AND 
     ph.user_id = p.user_id 
ORDER BY p.user_id, p.photo_id 

编辑使用左加入

SELECT p.user_id, p.photo_id, p.Photos, ph.date, v.Views 
FROM (SELECT v.user_id, v.photo_id, count(v.photo_id) as 'Views' 
     FROM userviews v 
     WHERE v.photo_id in (1,2,3 [...]) 
     GROUP BY v.photo_id, v.user_id 
    ) v left join (SELECT p.user_id, p.photo_id, count(p.photo_id) as 'Photos' 
     FROM photos p 
     WHERE p.photo_id in (1,2,3 [...]) 
     GROUP BY p.photo_id, p.user_id) p  
ON p.user_id = v.user_id AND p.photo_id = v.photo_id 
     left join photos ph 
On ph.photo_id = p.photo_id AND 
     ph.user_id = p.user_id 
ORDER BY p.user_id, p.photo_id 

或聚集在SELECT列表中的所有项目中,MySQL选择的值,对于其他列你可能会收到意想不到的结(REFER)这就是你得到错误结果的原因

+0

不幸的是,这只返回1行,即第一条记录。 – 2013-03-19 07:22:43

+1

检查编辑..我犯了第二个查询中的表名错误.. – Meherzad 2013-03-19 07:24:56

+0

好吧,这是更接近...现在唯一的问题是,where子句太限制,它模拟一个内部联接,我需要一个左外。 结果集从ID“1082”跳转到“1612”,跳过正确具有照片和无视图的用户“1117”。 – 2013-03-19 07:33:36

相关问题