【问题标题】:Selecting from two tables and counting a third从两个表中选择并数第三个
【发布时间】:2015-07-19 17:18:05
【问题描述】:

我有一个用户,问题和答案表,我想做的是根据他们的用户名从问题和用户表中选择,然后根据问题之间的关系计算答案表中的行数和答案表。请记住,表格的当前状态是:

Questions 表有四列(question_id、topic_id、username、question) Answers 表有两列 (question_id, answer) 用户表有两列(用户名、用户邮件) 我试过的查询

SELECT 
questions.question_id,
questions.username,
questions.question,
userlog.user_mail,
COUNT(answers.answer) as answerCount
FROM
questions
LEFT JOIN answers ON answers.question_id = questions.question_id, 
userlog
WHERE
questions.topic_id = '0d3fb89c012b5af12e1e0'
    AND userlog.username = questions.username

上面的问题是,它只返回一行而不是数据库中的三行。

【问题讨论】:

  • 您应该使用您实际使用的数据库、MySQL 或 SQL Server 来标记您的问题。而且,您可以通过在聚合查询中添加 group by 子句来解决您的问题。
  • 有人会快速给出答案。但我建议在用户表中有一个 int userId,它在其他地方使用。不是用户名。所以用户表中有 3 列。问题表将有 userId,而不是用户名。现在他们可以将用户名从 John Higgins 更改为 Sparky,并且您的数据不会被 foobar'd
  • @DrewPierce 这实际上是我在实际实现中所做的。这只是解决我的问题的草图。谢谢

标签: mysql sql database mysql-workbench


【解决方案1】:

您的查询存在一些问题。首先,COUNT() 的存在使查询成为聚合查询。如果没有GROUP BY,聚合查询只能生成一行。

另一个问题:您对 USERLOG 有一些 JOIN 混淆。希望每个用户在 USERLOG 中只有一行,否则您最终可能会重复计算答案。

试试这个查询

SELECT questions.question_id,
       questions.username,
       questions.question,
       userlog.user_mail,
       COUNT(answers.answer) as answerCount
  FROM questions
  LEFT JOIN userlog ON questions.username = userlog.username
  LEFT JOIN answers ON answers.question_id = questions.question_id
 WHERE questions.topic_id = '0d3fb89c012b5af12e1e0'
 GROUP BY questions.question_id, questions.username, questions.question, userlog.user_mail
 ORDER BY questions.username, questions.question_id

这应该会产生您需要的多行结果集。

【讨论】:

  • 谢谢!像魔术一样工作。以我想要的方式出现。再次感谢。
【解决方案2】:

试试这个:

SELECT questions.question_id,  
               questions.username, 
               questions.question, 
               userlog.user_mail, 
               (Select COUNT(answers.answer) where answers.question_id = questions.question_id) as answerCount 
FROM questions 
INNER JOIN userlog ON userlog.username = questions.username
WHERE questions.topic_id = '0d3fb89c012b5af12e1e0'

【讨论】:

    【解决方案3】:
    create table users
    (
        userId int auto_increment primary key,
        username varchar(100) not null,
        email varchar (100) not null
    );
    
    create table questions
    (
        qId int auto_increment primary key,
        topicId varchar(50) not null,
        userId int not null,
        question varchar(1000) not null
    );
    
    create table answers
    (   
        aId int auto_increment primary key,
        qId int not null,
        answer varchar(1000) not null
    );
    
    insert users (username,email) values ('sparky','sp@me.com'),('sarah','sarah@me.com');
    
    truncate table questions;   -- for debugging
    insert questions (topicId,userId,question) values ('0d3fb89c012b5af12e1e0',1,'Does life exist outside our galaxy?');
    insert questions (topicId,userId,question) values ('0d3fb89c012b5af12e1e0',1,'Are fish really that dumb? Really?');
    insert questions (topicId,userId,question) values ('xxxxxx',1,'Am I here?');
    insert questions (topicId,userId,question) values ('xxxxxx',1,'Am you here?');
    
    truncate table answers; -- for debugging
    insert answers (qId,answer) values (1,'I hope so.');
    insert answers (qId,answer) values (1,'I think so.');
    insert answers (qId,answer) values (2,'What is wrong with you.');
    insert answers (qId,answer) values (2,'Fish are nice.');
    insert answers (qId,answer) values (2,'I like turtles.');
    insert answers (qId,answer) values (3,'I like turtles too.');
    insert answers (qId,answer) values (3,'Me 3.');
    
    -- select * from users;
    -- select * from questions;
    -- select * from answers;
    
    
    select 
    q.qId,u.username,q.question,u.email,count(a.aId) as AnswerCount
    from users u
    join questions q
    on q.userId=u.userId  and q.topicId='0d3fb89c012b5af12e1e0'
    join answers a
    on a.qId=q.qId
    group by q.qId,u.username,q.question,u.email
    
    
    +-----+----------+-------------------------------------+-----------+-------------+
    | qId | username | question                            | email     | AnswerCount |
    +-----+----------+-------------------------------------+-----------+-------------+
    |   1 | sparky   | Does life exist outside our galaxy? | sp@me.com |           2 |
    |   2 | sparky   | Are fish really that dumb? Really?  | sp@me.com |           3 |
    +-----+----------+-------------------------------------+-----------+-------------+
    2 rows in set (0.04 sec)
    

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 2017-11-20
      • 2017-08-02
      • 1970-01-01
      • 2012-10-12
      • 2018-05-02
      相关资源
      最近更新 更多