【问题标题】:SQL Merging two or three tables with COUNT() and LEFT JOINSQL 使用 COUNT() 和 LEFT JOIN 合并两个或三个表
【发布时间】:2014-01-26 00:03:31
【问题描述】:

我确定之前有人问过这个问题,但我无法让我的代码工作:(

用户提出了多个问题。我需要显示用户进行某种用户搜索,然后显示每个用户问了多少问题。

表 1(用户): ID, 用户名, 密码, 头像, 注册日期, is_banned (ETC...)

表 2(问题): ID, questioner_id, 问题, 回答1, 回答2, 答案 3(等...)

我需要将两者合并,然后显示用户名等普通用户信息,但还要计算 questioner_id 行并显示用户提出了多少问题。

这是我到目前为止所拥有的,但它只是吐出一个结果并计算所有内容:

SELECT 
    users.id,
    users.username,
    users.avatar_location,
    users.datetime,
    users.last_action,
    users.last_action_description,
    users.is_banned,
    COUNT(questions.questioner_id)
FROM 
    `users` 
LEFT JOIN 
    `questions` 
ON 
    users.id = questions.questioner_id
ORDER BY
    datetime 
    ASC 

我很抱歉我完全“笨拙”。我已经找了一两个小时来了解如何做到这一点,但我无法解决它。

非常感谢

编辑:

非常感谢您的帮助!我最后的附加问题是我现在还有三分之一的桌子,这次我想计算回答的问题,因为我已经提出了问题。

表 3(questions_answered): ID, question_id, 用户身份, 正确(ETC...)

我已尝试将其添加到我的查询中,但不是显示回答的问题数,而是重复提出问题的结果。

这是我更新后的查询(再次抱歉,我只是在努力解决这个问题)

SELECT 
    users.id,
    users.username,
    users.avatar_location,
    users.datetime,
    users.last_action,
    users.last_action_description,
    users.is_banned,
    COUNT(questions_answered.question_id),
    COUNT(questions.questioner_id)
FROM 
    `users` 
LEFT JOIN 
    `questions` 
ON 
users.id = questions.questioner_id
LEFT JOIN
    `questions_answered`
ON
    users.id = questions_answered.user_id
GROUP BY
    users.id,
    users.username,
    users.avatar_location,
    users.datetime,
    users.last_action,
    users.last_action_description,
    users.is_banned
ORDER BY
    datetime 
    ASC 

非常感谢您的帮助!

【问题讨论】:

  • 首先,为什么要COUNT(questions.questioner_id)?这不可能是正确的!

标签: mysql sql


【解决方案1】:

第一部分(两张表)

我在查询字符串中有我的 cmets:

SELECT 
    users.id,
    users.username,
    users.avatar_location,
    users.datetime,
    users.last_action,
    users.last_action_description,
    users.is_banned,
    COUNT(questions.id) as number_of_questions #count each question
FROM 
    `users` 
LEFT JOIN 
    `questions` 
ON 
    users.id = questions.questioner_id
GROUP BY
    users.id # you need to have unique user id in each row
ORDER BY
    questions.datetime # sort by question date right? 
    DESC 

关于更新(三张表):

您需要嵌套选择,您不能同时对两列执行计数。我们把第一个select 当作users_questions_count 像一张桌子,那么一切又和两张桌子一样。错误的部分可能会在名称上产生歧义。

SELECT 
    users_questions_count.id,
    users_questions_count.username,
    users_questions_count.avatar_location,
    users_questions_count.datetime,
    users_questions_count.last_action,
    users_questions_count.last_action_description,
    users_questions_count.is_banned,
    users_questions_count.number_of_questions,
    COUNT(questions_answered.id) as number_of_answers # make sure you are counting the correct field!
FROM 
    (SELECT 
        users.id as id,
        users.username as username,
        users.avatar_location as avatar_location,
        users.datetime as datetime,
        users.last_action as last_action,
        users.last_action_description as last_action_description,
        users.is_banned as is_banned,
        COUNT(questions.id) as number_of_questions #count each question
    FROM 
        `users` 
    LEFT JOIN 
        `questions` 
    ON 
        users.id = questions.questioner_id
    GROUP BY
        users.id 
    ) as users_questions_count
LEFT JOIN 
    `questions_answered` 
ON 
    users_questions_count.id = questions_answered.user_id
GROUP BY
    users_questions_count.id 

三个表的总体思路(table1table2table3 加入table1.idtable2.item_idtable3.item_id):

SELECT 
    table1_table2_count.id,
    table1_table2_count.counter_1,
    COUNT(table3.id) as counter_2
FROM 
    (SELECT 
        table1.id as id,
        COUNT(table2.id) as counter_1
    FROM 
        `table1` 
    LEFT JOIN 
        `table2` 
    ON 
        table1.id = table2.item_id
    GROUP BY
        table1.id 
    ) as table1_table2_count
LEFT JOIN 
    `table3` 
ON 
    table1_table2_count.id = table3.item_id
GROUP BY
    table1_table2_count.id 

但最好找到一种解决方案来避免在实际庞大的数据中进行此类选择。如果您可以更新一张表并在其上放置counter_1counter_2,则写入过程会变慢,但读取(搜索)会更快。

【讨论】:

  • 非常感谢梅赫迪!真的很感激 :) 也许你可以帮助我在这篇文章中进行另一个编辑? :)
  • 你真是个天才!非常感谢,迈赫迪!真的非常感谢您的所有帮助。再次感谢!
【解决方案2】:

GROUP BY 添加到您的查询中:

SELECT 
    users.id,
    users.username,
    users.avatar_location,
    users.datetime,
    users.last_action,
    users.last_action_description,
    users.is_banned,
    COUNT(questions.questioner_id)
FROM 
    `users` 
LEFT JOIN 
    `questions` 
ON 
    users.id = questions.questioner_id
GROUP BY
    users.id,
    users.username,
    users.avatar_location,
    users.datetime,
    users.last_action,
    users.last_action_description,
    users.is_banned
ORDER BY
    datetime 
    ASC 

【讨论】:

  • 非常感谢尼古拉!有效!如果您有时间再次为第三张桌子提供帮助,我已经添加了一些额外的内容。
猜你喜欢
  • 2021-10-21
  • 1970-01-01
  • 2012-02-23
  • 2016-03-15
  • 1970-01-01
  • 2018-07-09
  • 2021-11-06
  • 1970-01-01
  • 2012-06-21
相关资源
最近更新 更多