【问题标题】:SubQuery in INNER JOIN (MySQL)INNER JOIN (MySQL) 中的子查询
【发布时间】:2013-12-22 00:30:01
【问题描述】:

我似乎有一个内部联接中的子查询有问题,我会这样做。

  • 服务器:通过 UNIX 套接字的本地主机
  • 软件:MySQL
  • 软件版本:5.5.32-nmm2-log - (Ubuntu)
  • 数据库客户端版本:libmysql - 5.5.32

有一个 m:n 表结构,包含 3 个表,其中只有 2 个与问题相关。

  • 第一个是一个包含演员的表,标识符:caid。
  • 第二个是将演员连接到电影的交叉表(演员id:caid,电影id:id)

当我像这样创建完整的内部联接时:

SELECT count( * ) AS Count, lastname, firstname
FROM DVDPROFILER_dvd_common_actor
INNER JOIN DVDPROFILER_dvd_actor ON DVDPROFILER_dvd_common_actor.caid = DVDPROFILER_dvd_actor.caid
WHERE DVDPROFILER_dvd_actor.caid > 0
GROUP BY DVDPROFILER_dvd_actor.caid
ORDER BY Count DESC 

我得到了我所期望的结果:顶级演员是按他在任何电影中出现的次数来计算的,即使是多个角色的多次。

我的目标是提取一个演员参演了多少部不同电影的信息,我想——尽管我很天真——它应该像这样简单:

SELECT count( * ) AS Count, lastname, firstname
FROM DVDPROFILER_dvd_common_actor
INNER JOIN
  (SELECT caid
  FROM DVDPROFILER_dvd_actor
  GROUP BY id) AS DVDPROFILER_dvd_actor 
ON DVDPROFILER_dvd_common_actor.caid = DVDPROFILER_dvd_actor.caid
WHERE DVDPROFILER_dvd_actor.caid > 0
GROUP BY DVDPROFILER_dvd_actor.caid
ORDER BY Count DESC 

但结果完全不正确

所以我用选定的演员检查了子查询

SELECT caid, id
FROM DVDPROFILER_dvd_actor
WHERE caid = 30801
GROUP BY id

得到了我所期望的结果

所以我玩了一下,当我在子查询中引入一个 LIMIT 子句时,我突然得到了不同但从未正确的回复。

SELECT count( * ) AS Count, lastname, firstname
FROM DVDPROFILER_dvd_common_actor
INNER JOIN 
  (SELECT caid
  FROM DVDPROFILER_dvd_actor
  GROUP BY id
  LIMIT 0 , 50000) AS DVDPROFILER_dvd_actor 
ON DVDPROFILER_dvd_common_actor.caid = DVDPROFILER_dvd_actor.caid
WHERE DVDPROFILER_dvd_actor.caid > 0
GROUP BY DVDPROFILER_dvd_actor.caid
ORDER BY Count DESC 

使用不同的 LIMIT,我得到了不同的结果,但在某些时候,当我超过某个限制时,结果与没有限制时完全一样 - 但同样错误。

我在这里忽略了什么? :-(

【问题讨论】:

    标签: mysql subquery inner-join


    【解决方案1】:

    你能试试这个吗?我猜COUNT(DISTINCT DVDPROFILER_dvd_actor.id) 对你有帮助。

    SELECT lastname, firstname, COUNT(DISTINCT DVDPROFILER_dvd_actor.id) AS Count
    FROM DVDPROFILER_dvd_common_actor
    INNER JOIN DVDPROFILER_dvd_actor ON DVDPROFILER_dvd_common_actor.caid = DVDPROFILER_dvd_actor.caid
    WHERE DVDPROFILER_dvd_actor.caid > 0
    GROUP BY lastname, firstname
    ORDER BY Count DESC 
    

    如果没有,当您在http://www.sqlfiddle.com/ 上发布您的数据和架构时,我们非常高兴。这使我们更容易测试

    谢谢。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多