【问题标题】:Find total number of rows using data from 3 tables, MySQL使用 3 个表中的数据查找总行数,MySQL
【发布时间】:2014-01-15 14:25:18
【问题描述】:

我想返回一个数字,但查询需要覆盖 3 个表,我想! 这是一个简单的例子,说明这 3 个表的情况(剪掉了几列)

table: opencall
---------------------------------
Users name | Site  | Phone      |
---------------------------------
John Smith | Leeds | 0113 1234567

table: userdb
-------------------------------------
emailAd         | site  | company   |
-------------------------------------
user@domain.com | Leeds | Yorks Post

table: company
----------------------------
pk_company_id  | division_name |
----------------------------
Yorks Post     | NORTH

现在,我要做的是在 opencall 中找到“division_name”为“NORTH”的总行数,我尝试了一些查询,但它们总是返回一个太大的数字。

这是我尝试过的一个示例:

SELECT count(*) FROM opencall, company, userdb WHERE userdb.site = opencall.site AND userdb.company = company.pk_company_id AND opencall.logdatex BETWEEN 1385041200 and 1388041200 AND opencall.condition NOT IN (8,9,11,12,19) AND company.division_name = 'NORTH`'

但是,这会返回超过 8,000 的结果,就像我刚刚输入的那样:

SELECT count(*) FROM opencall where logdatex BETWEEN 1385041200 and 1388041200 AND condition NOT IN (8,9,11,12,19)

这将返回 128,因此我在限制 Division_name 时所追求的数字应该在 20 左右。对此的任何帮助将不胜感激。

【问题讨论】:

    标签: mysql sql select join distinct


    【解决方案1】:

    你的数据结构搞砸了。公司和部门之间没有联系。您可以使用聚合从userdb 创建一个。我认为这可以满足您的要求:

    SELECT count(*)
    FROM (select distinct site, company
          from userdb u
         ) u join
         opencall o
         on u.site = o.site join
         company c
         on u.company = c.pk_company_id
    WHERE o.logdatex BETWEEN 1385041200 and 1388041200 AND
          o.condition NOT IN (8,9,11,12,19) AND
          c.division_name = 'NORTH`;
    

    【讨论】:

    • 我收到此错误,但我无法弄清楚它的错误所在 - 您的 SQL 语法有错误。检查与您的 MySQL 服务器版本相对应的手册,以了解在 'select distinct site, company from useredb u) u j 附近使用的正确语法
    • @Maff 。 . . userdb 拼写错误。
    【解决方案2】:

    试试这个:

    SELECT COUNT(DISTINCT oc.UsersName)
    FROM opencall oc 
    INNER JOIN userdb u ON oc.site = u.site
    INNER JOIN company c ON u.company = c.pk_company_id
    WHERE c.division_name = 'NORTH'AND oc.logdatex BETWEEN 1385041200 AND 1388041200 AND 
          oc.condition NOT IN (8,9,11,12,19)
    

    【讨论】:

    • 谢谢!效果很好,因为我还在学习,除了不同的部分我都明白了,你能解释一下这是做什么的吗?
    • @Maff 不客气。我刚刚添加了COUNT(DISTINCT oc.UsersName) 而不是COUNT(*),因为我们想找到特定部门的用户总数。所以我从opencall 表中计算了不同的用户
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    相关资源
    最近更新 更多