首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一次查询中的多个计数

一次查询中的多个计数
EN

Stack Overflow用户
提问于 2012-08-12 21:12:25
回答 3查看 125关注 0票数 2

我有三张这样的桌子:

漫画

代码语言:javascript
复制
|   id  | sendby
------------------
|   1   |   1
|   2   |   1
|   3   |   1
|   4   |   1

查普雷尔

代码语言:javascript
复制
|   id  | sendby    | translator | graphic
-------------------------------------------
|   1   |   1       |   admin    |  other
|   2   |   1       |   admin    |  other
|   3   |   1       |   admin    |  admin
|   4   |   1       |   other    |  admin

用户

代码语言:javascript
复制
|   userid  | username  
-----------------------
|      1    |   admin       

我试着数一下我发过的所有东西,但结果不正确。

我尝试过以下查询:

代码语言:javascript
复制
SELECT username,
   SUM(
       CASE WHEN m.sendby = u.userid
       THEN 1 ELSE 0 END
   ) AS manga,
   SUM(
       CASE WHEN c.sendby = u.userid
       THEN 1 ELSE 0 END
   ) AS chapter,
   SUM(
       CASE WHEN c.translator = u.username
       THEN 1 ELSE 0 END
   ) AS translator,
   SUM(
       CASE WHEN c.graphic = u.username
       THEN 1 ELSE 0 END
   ) AS graphic
FROM user u
    left JOIN manga m 
        ON m.sendby = u.userid 
    left JOIN chapter c 
        ON c.sendby = u.userid 
where u.userid = '1'

但是返回this是不正确的:

漫画: 16,第:16章,翻译: 12,附图:8

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-12 21:27:40

以下是对此的查询

代码语言:javascript
复制
select
  m.id,
  count(m.sendby) as Manga,
  lc.Chapter,
  rc.Translater,
  c.Grafix
from manga as m
  left join (select sendby, count(sendby) as Chapter from chaprer) as lc on lc.sendby  = m.sendby
  left join (select sendby, count(translater) as Translater from chaprer where translater = 'admin') as rc on rc.sendby  = m.sendby
  left join (select sendby, count(graphics) as Grafix from chaprer where translater = 'admin') as c on c.sendby  = m.sendby

编辑

我测试了这个查询,结果如下所示

代码语言:javascript
复制
Query Result
id  Manga   Chapter Translater  Grafix
1   4       4       3           3 
票数 2
EN

Stack Overflow用户

发布于 2012-08-12 21:23:10

你是故意使用left JOIN的吗?你知道它是怎么works的吗?使用它两次使您的select在16行结果表上运行。首先尝试选择所有结果(*),然后修复FROM子句以返回要从中选择的所需数据。

从您的评论来看,您似乎打算使用Inner join

票数 1
EN

Stack Overflow用户

发布于 2012-08-12 22:40:18

一种直接的方法是这样做:

代码语言:javascript
复制
SELECT  username,
(SELECT COUNT(m.sendby) FROM manga m WHERE m.sendby= u.userid) AS manga,
(SELECT COUNT(c.sendby) FROM chapter c WHERE c.sendby= u.userid) AS chapter,
(SELECT COUNT(t.sendby) FROM chapter t WHERE t.translator= u.username) AS translator,
(SELECT COUNT(g.sendby) FROM chapter g WHERE g.graphic= u.username) AS graphic
FROM USER u
WHERE userid=1

如果运行以下命令,您将在原始查询中看到问题:

代码语言:javascript
复制
SELECT *
FROM USER u
    LEFT JOIN manga m 
        ON m.sendby = u.userid 
    LEFT JOIN chapter c 
        ON c.sendby = u.userid 
WHERE u.userid = '1'

左联接返回重复的行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11922440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档