使用两个连接和一个计数的mysql搜索
我目前正在尝试编写一个通用查询,它返回1个表和另一个联接表的内容以及第三个表的结果行数 现在,我的描述可能看起来很抽象,所以我将尝试将其形象化 表:使用两个连接和一个计数的mysql搜索,mysql,join,count,Mysql,Join,Count,我目前正在尝试编写一个通用查询,它返回1个表和另一个联接表的内容以及第三个表的结果行数 现在,我的描述可能看起来很抽象,所以我将尝试将其形象化 表: posts | ID | title | description | creator_id | 1 Title1 Descr1 1 2 Title2 Descr2 1 users | ID | name | avatar |
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
| ID | title | description | name | avatar | view_count |
1 Title1 Descr1 User1 PATH 2
我当前的查询如下所示:
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
但只打印出posts结果,其交互如下:
| ID | title | description | name | avatar | view_count |
1 Title1 Descr1 User1 PATH 2
2 Title2 Descr2 User1 PATH 0
| ID | title | description | name | avatar | view_count |
1 Title1 Descr1 User1 PATH 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
你好像错过了这个条款。如果没有这一点,当您使用像COUNT这样的聚合函数时,会显示:
只有一个组,它是不确定的
要为组选择哪个名称值
这就是查询仅返回1行的原因。请尝试以下操作:
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
你好像错过了这个条款。如果没有这一点,当您使用像COUNT这样的聚合函数时,会显示:
只有一个组,它是不确定的
要为组选择哪个名称值
这就是查询只返回1行的原因。试试这个
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
试试这个
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
您只需子查询第三个表即可计算条目数:
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
这也有助于提高性能没有组,没有未优化的联接您只需子查询第三个表即可计算条目:
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
这对性能也有好处没有组,没有未优化的联接你能在这里以小提琴的形式提供示例数据吗?@10086 User2是一个键入错误。@noa dev,只是在你的查询中按posts.id添加了这个组,那么它会很好地工作。你能在这里用小提琴提供示例数据吗?@10086 User2是一个键入错误。@noa dev,刚刚在你的查询中通过posts.id添加了这个组,那么它会工作得很好。仍然只有一行的结果:那不可能。您的数据或其他地方一定有问题。仍然只有一行的结果:不可能。您的数据或其他地方一定有问题。这会打印出相同的POST行,打印的次数与打印的行数相同are@noa-dev请再试一次,或者检查sqlfiddle链接。这会打印出相同的posts行,打印的次数与那里的相同are@noa-dev请再试一次,或者检查sqlfiddle链接。谢谢大家,寻求反馈。很高兴帮助您谢谢大家的反馈。很高兴帮助你