Mysql连接不同

标签 mysql join relational-database

返回所有帖子的查询,以及查看该帖子的次数以及该帖子的点赞数。问题是它返回重复项,因为我在查询中有另一个连接

        SELECT count(bv.postId) as views, SUM(if(vote=1, 1, 0)) as likes, SUM(if(vote=-1, 1, 0)) as meeh, GROUP_CONCAT(taxonomy_id) as target, GROUP_CONCAT(t.name) as tname, `t`.`type` as `ttype`, `users`.`fullname`, `users`.`picture`, `users`.`role`, `users`.`picture`, `blog`.* FROM `blog` 
INNER JOIN `blog_taxonomy` `bt` ON `bt`.`blog_id` = `blog`.`id` 
INNER JOIN `users` ON `users`.`id` = `blog`.`user_id` 
INNER JOIN `taxonomy` `t` ON `t`.`id` = bt.`taxonomy_id` 
LEFT JOIN `blog_views` `bv` ON `blog`.`id` = `bv`.`postId` 
WHERE MONTH(blog.time_posted) = 4 AND `blog`.`deleted` =0 GROUP BY `blog`.`id` ORDER BY `blog`.`id` DESC

blog_views 表是一个简单的表,我用它来跟踪谁看到了什么帖子,以及他是否喜欢

Table:blog_views 
postId  userId  vote[int values, 1 for like, -1 for dislike and 0 default]

问题是 View 计数总是返回 blog_taxonomy 表的 n*count!我用它来控制帖子上的标签。

Table blog_taxonomy:
taxonomy_id post_id
 1           1
 2           1
Table Taxonomy
 id  name
  1   art
  2   music

这是一个多对多的表,用于将帖子与标签链接起来。从查询中删除它可以解决问题:(但我需要它在那里!

我尝试在group by中添加bv.postId,但似乎根本没有效果!

正常情况下,我可以使用以下方式获取我想要的帖子的浏览数据

select count(bv.postId) as views, SUM(if(vote=1, 1, 0)) as likes, SUM(if(vote=-1, 1, 0)) as meet from blog_views where postId = ?{blog.id}
group by postId

我在这里缺少什么?

编辑

使用子查询解决了这个问题。那么为什么下面的子查询方法有效而连接不起作用?

SELECT bv.views, bv.likes, bv.meeh, GROUP_CONCAT(taxonomy_id) as target, GROUP_CONCAT(t.name) as tname, `t`.`type` as `ttype`, `users`.`fullname`, `users`.`picture`, `users`.`role`, `users`.`picture`, `blog`.* FROM `blog` 
INNER JOIN `blog_taxonomy` `bt` ON `bt`.`blog_id` = `blog`.`id` 
INNER JOIN `users` ON `users`.`id` = `blog`.`user_id` 
INNER JOIN `taxonomy` `t` ON `t`.`id` = bt.`taxonomy_id` 
LEFT JOIN (select count(*) as views,postId,SUM(if(vote=1, 1, 0)) as likes, SUM(if(vote=-1, 1, 0)) as meeh from `blog_views` group by postId) `bv` ON `bt`.`blog_id` = `bv`.`postId` 
WHERE MONTH(blog.time_posted) = 4 AND `blog`.`deleted` =0 GROUP BY `blog`.`id` ORDER BY `blog`.`id` DESC

最佳答案

据我了解,您在分类表上的 JOIN 条件不正确 加入分类 t ON t.id =taxonomy_id

  1. taxonomy_id 添加别名,即 bt.taxonomy_id,如果这仍然不起作用
  2. 将所有连接设为 INNER JOIN

关于Mysql连接不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36951457/

相关文章:

php - 将 N 小时添加到 MySQL 日期时间表示

mysql - Oracle:带有 IN 子句的参数化查询返回空值

SQL INSERT INTO SELECT - 现有行

mysql - 将数据库内容从一种非常糟糕的结构迁移到一种非常合乎逻辑的结构的最佳实践?

sql - Compojure + clojure.contrib.sql : SELECT query is being cached. 为什么?

mysql 更新子查询 2 级深度

python - 按公共(public)列合并 2 个 .csv 文件

php - 创建包含总计的报告

database - ER图中的一对多关系

database - 用 cocoa 创建数据库软件