Mysql计数与两个表的内联接,平均加入

时间:2013-05-29 06:21:55

标签: mysql join count

我渴望加入两张桌子,但似乎无法正确使用,结构看起来像这样。

表1(成员) [UserLogin |姓名]

表2(文章) [ArtID |作家|内容] Article.writer指向Members.UserLogin

我想用尽可能少的代码显示注册用户登录的完整列表,但也要显示他们可能写了多少篇文章的数量,或者如果他们没有写任何文章他们应该仍然在列表上。

我想要什么: [UserLogin |名称| ArticlesWritten]

到目前为止我得到的是:

SELECT UserLogin, Name, Writer, count(*)
FROM Article
INNER JOIN Members on Writer=UserLogin
GROUP BY UserLogin;

SELECT UserLogin, Name, count(Writer)
FROM Article
LEFT JOIN Members ON UserLogin = Writer
GROUP BY 1;

它们都列出了mysql中的所有内容,但它们都没有包含那些从未写过任何文章的用户的UserLogins和Names。你们能指出我正确的方向吗?我理解我的查询问题,但我不知道如何解决它。

我在这个论坛上发现了类似的问题,但我没有得到任何解决方案。可能是一个语言barriere或只是一个普通缺乏基本的mysql知识。

4 个答案:

答案 0 :(得分:13)

您可以使用子查询

SELECT m.UserLogin, 
       m.Name, 
       (SELECT COUNT(*) 
          FROM Articles 
         WHERE Writer = m.UserLogin) ArticlesWritten
  FROM Members m

示例输出:

| USERLOGIN |  NAME | ARTICLESWRITTEN |
---------------------------------------
|     user1 |  Jhon |               2 |
|     user2 | Helen |               0 |

这是 SQLFiddle

答案 1 :(得分:6)

只需使用LEFT JOIN交换表名,

SELECT UserLogin, Name, count(Writer)
FROM   Members 
       LEFT JOIN Article on Writer = UserLogin
GROUP  BY UserLogin, Name

要进一步了解联接,请访问以下链接:

在您提出的问题中,“外键是”名称“指向”作家“,不是writer is pointing to UserLogin表中Article依赖的在表Members上?

答案 2 :(得分:2)

SELECT
  m.UserLogin,
  m.Name,
  (SELECT
     COUNT(a.ArtID)
   FROM Article a
   WHERE a.Writer = m.UserLogin) AS ArticlesWritten
FROM Members m

答案 3 :(得分:0)

试试这个。

SELECT m.UserLogin,m.Name,COUNT(a.ArtID) FROM Members m LEFT JOIN Article a ON a.Writer=m.Name GROUP BY m.Name;