2012-12-08 170 views
25

我看到很多类似的问题,但它们要么太复杂,我不能理解它们,要么它们似乎没有问同样的问题。在另一个语句(子查询?)中使用一个sql查询的结果

很简单:我有两列:用户(dmid)和下载(dfid)。

  1. 选择谁下载特定文件中的所有用户:

    SELECT DISTINCT dmid FROM downloads_downloads where dfid = "7024" 
    
  2. 使用上面的用户,找到所有他们所有下载的文件:

    SELECT dfid from downloads_downloads WHERE dmid = {user ids from #1 above} 
    
  3. 计数和秩序的英国国际发展部结果,所以我们可以看到每个文件接收的下载量有多少:

    dfid dl_count_field 
    ---- -------------- 
    18  103 
    3  77 
    903  66 
    

我试图回答。

这看起来很接近,但MySql陷入泥潭,甚至在30秒后也不响应 - 我最终重新启动了Apache。我现在不会因为复杂的陈述而没有得到语法错误来构造计数和顺序 - 甚至可能不是正确的陈述。

SELECT dfid from downloads_downloads WHERE dmid IN (
    SELECT DISTINCT dmid FROM `downloads_downloads` where dfid = "7024") 
+3

你不应该使用用双引号(''')来表示字符文字,用单引号代替。双引号是MySQL的东西,不能与其他DBMS一起工作(因为在标准SQL中,双引号用于标识符,而不是文字)。那个dfid是一个数值,你不应该使用任何引号。数字不需要引号。 –

回答

33
SELECT dfid,count(*) 
from downloads_downloads 
WHERE dmid IN (
    SELECT dmid 
    FROM downloads_downloads 
    where dfid = "7024" 
) 
group by dfid 

或使用自加入

select t1.dfid,count(*) 
from downloads_downloads t1 
inner join downloads_downloads t2 
on t1.dmid = t2.dmid 
where t2.dfid = "7024" 

如果这个时间太长,那么你可能会需要发布一个解释计划(谷歌吧!)

+4

对于我的解决方案#1的作品,其相当容易理解,但可以请你解释一下,我解决方案#2我可以站在自我加入 –

+0

@ paul-creasey我知道这是旧的,但你能解释第二个代码吗? – Rafael

相关问题