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

Posted

技术标签:

【中文标题】在另一个 where 语句(子查询?)中使用一个 sql 查询的结果【英文标题】:Use results from one sql query in another where statement (subquery?) 【发布时间】:2012-11-26 14:10:32 【问题描述】:

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

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

    选择下载特定文件的所有用户:

    SELECT DISTINCT dmid FROM downloads_downloads where dfid = "7024"
    

    使用上面的用户,找到他们都下载的所有文件:

    SELECT dfid from downloads_downloads WHERE dmid = user ids from #1 above
    

    对 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 的东西,不能与其他 DBMS 一起使用(因为在标准 SQL 中,双引号用于标识符,而不是文字)。如果那个 dfid 是一个数值,你就不应该使用任何引号。数字不需要引号。 【参考方案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"

如果这花费的时间太长,那么您可能需要发布一个解释计划(谷歌它!)

【讨论】:

对我来说解决方案 #1 有效,而且它很容易理解,但你能解释一下吗,我的解决方案 #2 我可以理解自我加入 @paul-creasey 我知道这是旧的,但你能解释一下第二个代码吗? 注意:如果您的最终目标是执行update,第一种方法会导致错误,而这个其他答案帮助我解决了这个问题:***.com/questions/45494/… 我将这两个都用于我的用例,将第一个解决方案转储到第二个解决方案的 where 语句中。

以上是关于在另一个 where 语句(子查询?)中使用一个 sql 查询的结果的主要内容,如果未能解决你的问题,请参考以下文章

mysql_数据查询_嵌套查询

MySQL 子查询用法和注意事项

如何在另一个准备好的语句中使用 PreparedStatement 作为子查询

数据库系统原理作业七数据查询中的嵌套查询

MySQL基础语法之子链接查询和特殊查询(union 和 limit)

where条件放在子SQL语句中是否查询速度更快?