【问题标题】:mysql search with two joins and a countmysql搜索有两个连接和一个计数
【发布时间】:2016-06-24 07:41:29
【问题描述】:

我目前正在尝试编写一个通用查询,它返回一个表和另一个连接表的内容以及第三个表的结果行数。

现在我的描述可能看起来很抽象,所以我将尝试将其可视化

表格:

posts
|  ID  |  title  |  description |  creator_id  |
   1      Title1    Descr1             1
   2      Title2    Descr2             1

users
|  ID  |  name  |  avatar |
   1      User1    PATH

interactions
|  ID  |  type  |  target_id  |  identifier  |
   1      view       1             IP
   2      view       1             IP

现在我正在寻找的是这样的输出:

|  ID  |  title  |  description  |  name  |  avatar  |  view_count  |
   1      Title1    Descr1          User1    PATH           2
   2      Title2    Descr2          User1    PATH           0

我当前的查询如下所示:

SELECT 
    posts.id, posts.title, posts.description,
    users.name, users.avatar,
    COUNT(interactions.id) AS view_count
FROM
    posts
LEFT JOIN
    users
    ON
        posts.creator_id = users.id
LEFT JOIN
    interactions
    ON
        posts.id = interactions.target_id

但只打印出具有这样交互的帖子结果:

|  ID  |  title  |  description  |  name  |  avatar  |  view_count  |
   1      Title1    Descr1          User1    PATH           2

我需要如何更改查询,以便同时获得碰巧还没有任何交互的其他行?

感谢您的帮助!

【问题讨论】:

  • sqlfiddle.com你能提供这里的示例数据吗?
  • @10086 User2 输入错误。
  • @noa-dev,刚刚在您的查询中添加了这个“group by posts.id”,它就会完美地工作。

标签: mysql join count


【解决方案1】:

您可以简单地对第三个表进行子查询以计算条目数:

SELECT 
    posts.id, posts.title, posts.description,
    users.name, users.avatar,
    (SELECT COUNT(*) FROM interactions i WHERE i.target_id = posts.id) AS view_count
FROM
    posts
LEFT JOIN
    users
    ON
        posts.creator_id = users.id

这对性能也更好(没有组,没有未优化的连接)

【讨论】:

  • 谢谢大家的反馈。很高兴为您提供帮助
【解决方案2】:

试试这个:

SELECT P.ID
    , P.title
    , P.description
    , U.name
    , U.avatar
    , IFNULL(COUNT(I.ID), 0) AS view_count
    FROM posts P
    LEFT JOIN users U ON U.ID = P.creator_id
    LEFT JOIN interactions I ON I.target_id = P.ID
    GROUP BY P.ID

您似乎错过了GROUP BY 子句。如果没有这个,当你使用像 COUNT 这样的聚合函数时,documentation 会说:

只有一个组,它是不确定的 为组选择哪个名称值

这就是您的查询只返回 1 行的原因。

【讨论】:

  • 仍然只有 1 行的结果 :(
  • 不可能。你的数据一定有问题,或者其他地方有问题。
【解决方案3】:

试试这个;)

select posts.id, posts.title, posts.description, users.name, users.avatar, coalesce(t3.view_count, 0) as view_count
from posts 
left join users on posts.creator_id = users.id
left join (
    select target_id, count(1) as view_count from interactions group by target_id
) t3 on posts.id = t3.target_id

SQLFiddle HERE

【讨论】:

  • 这会尽可能多地打印出相同的帖子行
  • @noa-dev 请再试一次或检查 sqlfiddle 链接。
猜你喜欢
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 2014-05-14
  • 2012-12-19
  • 2020-12-07
  • 2016-01-09
相关资源
最近更新 更多