我有一个包含4个与此问题相关的表的数据库。我只为每个表提供了必需的列,以免使事情复杂化。
评论
ID | reviewID
主题
ID | themeID |名称
评论主题
ID | reviewID | themeID
评论主题
ID | reviewID | themeID
因此,评论可以具有多个主题和多个子主题。每个子主题都应与一个主题相对应,这意味着没有其主主题就不能存在一个子主题。themes
表是保存主题或子主题名称的地方。
在这一刻,我已经进行了查询,可以获取我需要的所有数据。因为它使多行,所以我为主题和子主题做了一个group_concat。这意味着对于每个个人评论,我都有一个称为“主题”的列。在此列中,包含用逗号分隔的所有主题和子主题。
这是我的查询:
select `reviews`.`reviewID`,
GROUP_CONCAT(`themes`.`name`) as `Name`
from `reviews`
left join `reviewthemes` on `reviewthemes`.`reviewId` =`reviews`.`reviewId`
left join `reviewsubthemes` on `reviewsubthemes`.`reviewid` = `reviews`.`reviewid`
left join `themes` on (`themes`.`themeid` = `reviewthemes`.`themeid` or `themes`.`themeid` = `reviewsubthemes`.`themeid`)
where `reviews`.`healthwatchID` = 32
and (`review_created` BETWEEN '2015-08-01 00:00:00' AND '2015-08-31 23:59:59')
group by `reviews`.`reviewID`
这将带回看起来像这样的数据:
现在这是棘手的部分,我不确定是否需要在PHP或MYSQl中执行此操作,但是可以肯定地说我真的很困惑。
我要求格式如下:
theme - subtheme; theme - subtheme; theme;
因此,您可以看到我需要一个主题和一个子主题才能在末尾使用半冒号。但是有些评论的主题可以不包含子主题,然后主题可以不包含子主题。
最好的方法是什么?
最佳答案
您可以使用CONCAT将名称和子名称连接在一起,然后对结果进行GROUP_CONCAT:
select reviews.reviewID,
GROUP_CONCAT(CONCAT_WS(' - ', t1.name, t2.name) SEPARATOR ';') as Name
from reviews
left join reviewthemes on reviewthemes.reviewId =reviews.reviewId
left join reviewsubthemes on reviewsubthemes.reviewid = reviews.reviewid
left join themes t1 on (t1.themeid = reviewthemes.themeid)
left join themes t2 on (t2.themeid = reviewsubthemes.themeid)
where reviews.healthwatchID = 32
and (review_created BETWEEN '2015-08-01 00:00:00' AND '2015-08-31 23:59:59')
group by reviews.reviewID