具有多个AND OR条件的复合mysql COUNT查询

时间:2016-09-29 21:17:26

标签: mysql

以下mysql查询旨在将多个表连接在一起,并根据给定表的时间对每个表进行计数。

SELECT 
   COUNT(DISTINCT s.id) AS textcnt,
   COUNT(DISTINCT f.id) AS favcnt
                    FROM stream_updates s 
                        LEFT JOIN favorites f
                    ON f.username=s.username                        
                        INNER JOIN members m
                    ON m.username=s.username 
                    WHERE (m.username = 'testuser1'
                    AND (m.username IN (
                           SELECT friend2 as username FROM list_friends 
                           WHERE (friend1 = 'testuser1' AND friend2 <> 'testuser1') 
                    )) OR (m.username IN (
                           SELECT friend1 as username FROM list_friends
                           WHERE (friend2 = 'testuser1' AND friend1 <> 'testuser1')
                    ))) AND (s.time between (NOW() - INTERVAL 1 DAY) AND NOW()
                    OR (f.time between (NOW() - INTERVAL 1 DAY) AND NOW()))

出于某种原因,上述ALWAYS返回零。

以下是一个示例查询: http://sqlfiddle.com/#!9/a88f1e/1

示例中的查询应该返回:

textcnt: 2 // id's 1 and 4 from the stream_updates table
favcnt: 1 // id 1 from the favorites table

而是两个计数都返回0

请理解你是否建议重写我实际上用LEFT JOIN计算5个表的查询,为了简单起见,我只是将其删除了。

我也很难正确编写WHERE子句。它需要检查成员表中是否存在用户,如果是,则对用户执行查询。然后,它需要检查用户是否在list_friends表中,如果是,则进一步对用户的朋友执行查询。我担心我写它的方式会检查以确保两者都在发生。但是,如果我将它从AND更改为OR,我遇到的问题是,如果用户在成员表中,查询将不执行OR。

更新CLARIFY WHERE CLARUSE

我正在尝试在where子句中执行以下操作:

首先获取会员的所有计数&#39; testuser1&#39;

其次,如果testuser1在list_friends中列出的朋友也包括他们在计数中的结果。

第三,基于&#39;时间&#39;过去24小时的每个表的基本结果。它被张贴了。

附加注意,我还有其他查询,我抓住过去48小时减去过去24小时(因此结果来自2天前,但不是今天)...并且它继续,所以请不要重写这样的它会抓住过去的24小时&#34;因为那时我会在别处申请它会抓住#34;过去48小时&#34;不是&#34;从2天前24小时&#34;。

0 个答案:

没有答案