在另一个 where 语句中使用一个 sql 查询的结果(子查询?

Use results from one sql query in another where statement (subquery?)

提问人:Josh Bond 提问时间:12/9/2012 最后编辑:ScimonsterJosh Bond 更新时间:10/28/2014 访问量:134965

问:

我看到很多类似的问题,但它们要么太复杂了,我无法理解,要么它们似乎没有问同样的事情。

很简单:我有两个列:用户 (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 结果进行计数和排序,以便我们可以看到每个文件收到了多少下载:

    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")
MySQL SQL 子查询

评论

3赞 12/9/2012
不应对字符文字使用双引号 (),而应改用单引号。双引号是MySQL的东西,不适用于其他DBMS(因为在标准SQL中,双引号用于标识符,而不是文字)。如果该 dfid 是一个数值,则不应全部使用任何引号。数字不需要引号。"

答:

65赞 Paul Creasey 12/9/2012 #1
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赞 noobie-php 1/29/2014
对我来说,解决方案 #1 有效,而且很容易理解,但你能解释一下吗,我的解决方案 #2 我可以站在自己加入
0赞 Rafael 10/6/2015
@paul-creasey 我知道这已经过时了,但你能解释一下第二个代码吗?
0赞 Mike B 4/7/2021
注意:如果你的最终目标是执行 ,第一种方法将导致错误,另一个答案帮助我解决了这个问题:stackoverflow.com/questions/45494/......update
0赞 TeflonMusk 8/26/2021
我在用例中使用了这两个解决方案,将第一个解决方案转储到第二个解决方案的 where 语句中。