【问题标题】:MySql Join condition with Where condition to get list of dataMySql Join 条件与 Where 条件以获取数据列表
【发布时间】:2018-10-24 07:37:51
【问题描述】:

我创建了以下表格 -

评论:

|  column   |    type     |
+-----------+-------------+
| comment_id| int(11)     |
| comment   | longText    |
| parent_id | int(11)     |
+-----------+-------------+

评论元:

|  column   |    type     |
+-----------+-------------+
| comment_id| int(11)     |
| key       | varchar(40) |
| value     | varchar(50) |
+-----------+-------------+

comment meta(delete, reply_count, report) 中有key 值。

数据通过以下方式添加到表中:

  • 当用户写评论时,它会添加到comments 数据库中,parent_id 设置为 0。
  • 当用户为特定评论撰写回复时,它会添加到 comments 数据库中,其中 parent_id 设置为评论的 comment_id 以及该评论的 reply_count' is updated in thecmets_meta` 数据库。
  • 当用户删除评论或回复时,comments_meta 数据库中的值会更新,但将 key 设置为 delete 并将 value 设置为 1 w.r.t 到该评论或回复 ID,而不是删除它来自comments 数据库。

我想要的只是获取所有未删除的 cmets 的列表。

到现在我都试过了:

select comments.comment_id,comments.comment, ifnull(comments_meta.value,0) as reply_count from comments left join comments_meta on comments_meta.comment_id = comments.comment_id and comments_meta.meta_key = "reply_count";

这给了我所有的 cmets,包括已删除的 cmets。

是否可以使用此表模型获取列表以及如何获取? 或者我应该附上delete 或'reply_countwithcomment` 表中的一个属性?

示例数据注释:

|comment_id |    comment  |  parent_id  |  
+-----------+-------------+-------------+
|    1      | comment1    |      0      | 
|    2      | comment2    |      0      |
|    3      | reply1      |      1      |
|    4      | reply2      |      1      |
|    5      | comment3    |      0      |
+-----------+-------------+-------------+

示例数据评论元:

|comment_id |     key     |    value    |  
+-----------+-------------+-------------+
|    2      |   delete    |      1      | 
|    1      | reply_count |      2      |
+-----------+-------------+-------------+

预期输出:

|comment_id |    comment  | reply_count |  
+-----------+-------------+-------------+
|    1      |  comment1   |      2      | 
|    5      |  comment3   |      0      |
+-----------+-------------+-------------+

【问题讨论】:

标签: mysql left-join


【解决方案1】:

DDL:

create table `comment`(
  `comment_id` int not null auto_increment,
  `comment` varchar(128),
  `parent_id` int not null,
  primary key(`comment_id`)
);


insert into `comment`(`comment_id`,`comment`,`parent_id`) values
(1,'comment1',0),
(2,'comment2',0),
(3,'reply1',1),
(4,'reply2',1),
(5,'comment3',0);

create table `comment_meta`(
  `comment_id` int not null,
  `key` varchar(128),
  `value` int not null,
  primary key(`comment_id`,`key`)
);

insert into `comment_meta`(`comment_id`,`key`,`value`) values
(2,'delete',1),
(1,'reply_count',2);

让我们只获取“根”cmets:

  SELECT * FROM `comment` 
  WHERE `parent_id` = 0

让我们只选择 cmets:

  SELECT * FROM `comment` 
  WHERE `parent_id` != 0 

让我们加入(外部 - 列出所有根 cmets)这两个子查询,看看我们得到了什么:

SELECT *
FROM
(
  SELECT * FROM `comment` 
  WHERE `parent_id` = 0
) AS `root_comments`
LEFT JOIN 
(
  SELECT * FROM `comment` 
  WHERE `parent_id` != 0  
) `replies` ON `replies`.`parent_id` = `root_comments`.`comment_id`;

我们得到类似 this 的信息:

现在让我们在结果集中再添加一列,显示该行代表根评论 (0) 还是回复 (1):

SELECT *,IF(`replies`.`comment_id` IS NOT NULL, 1, 0)
FROM
(
  SELECT * FROM `comment` 
  WHERE `parent_id` = 0
) AS `root_comments`
LEFT JOIN 
(
  SELECT * FROM `comment` 
  WHERE `parent_id` != 0  
) `replies` ON `replies`.`parent_id` = `root_comments`.`comment_id`;

让我们选择已删除的 cmets:

SELECT * FROM `comment_meta`
WHERE `key` = 'delete'

将它们加入我们目前拥有的内容并添加WHERE 条件以仅考虑那些在元表中没有具有“删除”键的相应行的cmets:

WHERE `deleted_comments`.`comment_id` IS NULL

最后我们只需要选择需要的列和GROUP BYcomment/SUM()每个评论的回复(1):

请注意,在 MySQL 5.7 中,GROUP BY 默认模式已更改,如果不更改此设置,您将无法 SUM 非分组列。

SELECT `root_comments`.`comment_id`,`root_comments`.`comment`,SUM(IF(`replies`.`comment_id` IS NOT NULL, 1, 0)) AS reply_count
FROM
(
  SELECT * FROM `comment` 
  WHERE `parent_id` = 0
) AS `root_comments`
LEFT JOIN 
(
  SELECT * FROM `comment` 
  WHERE `parent_id` != 0  
) `replies` ON `replies`.`parent_id` = `root_comments`.`comment_id`
LEFT JOIN 
(
  SELECT * FROM `comment_meta`
  WHERE `key` = 'delete'
) `deleted_comments` ON `deleted_comments`.`comment_id` = `root_comments`.`comment_id`
WHERE `deleted_comments`.`comment_id` IS NULL
GROUP BY `root_comments`.`comment_id`;

这是带有此工作示例的 DBFiddle 的 link

【讨论】:

    猜你喜欢
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    相关资源
    最近更新 更多