Mysql如何处理JOIN和重复条目

时间:2014-08-10 22:38:38

标签: php mysql sql

我有一个articles表,其中包含所有文章 我有一个comments表,其中包含一个字段article_id,其中包含一篇文章的评论。

我首先做了这样的连接查询:

SELECT Article.*, Comment.* FROM articles LEFT JOIN comments As Comment ON(Article.id = Comment.article_id)

我的数据格式如下:

Article1 Comment1
Article1 Comment2
Article1 Comment3

然后我使用group by:

SELECT Article.*, Comment.* FROM articles LEFT JOIN comments As Comment ON(Article.id = Comment.article_id) GROUP BY Article.id

我的数据格式如下:

Article1 Comment1

我希望我的数据格式如下:

Article1 Comment1
         Comment2
         Comment3

无论如何使用MySQL 来获取我的数据格式?如果可能,避免子查询?

1 个答案:

答案 0 :(得分:0)

正如评论所说,最好在表示层而不是数据层中执行此操作。 MySQL和其他数据库引擎擅长存储数据,以最佳方式执行查询并获得结果。做你想要的东西并不是一件容易的事。当然你可以做这样的事情,但在前端做这件事会更有效率。我使用C#和SQL Server,我想不出一个案例,我会做的不仅仅是用SQL检索数据。无论您想做什么,使用表示层进行处理都要容易得多。您的一条评论询问了处理一百万行的问题。我经常使用的几个表有超过十亿行。我仍然不会在SQL Server中进行任何格式化。

您询问了GROUP BY功能的用途。简而言之,GROUP BY表示将记录放入GROUP BY子句中所有列相同的组中。 GROUP BY最常见的用途之一是计数和聚合函数(COUNT(),SUM()等)。请考虑以下查询:

SELECT 
    Customer_Id, 
    COUNT(Order_Id), 
    SUM(Amount_Paid), 
    SUM(Amount_Paid) / COUNT(Order_Id)
FROM dbo.Sales
GROUP BY Customer_Id

在此查询中,我们从虚构的Sales表中选择记录。当我们说GROUP BY Customer_Id时,我们基本上说"创建组并将具有相同Customer_Id的所有记录放在同一组"中。如果我们想要计算客户已下订单的数量(COUNT(Order_Id)),或者我们想要查看客户在我们的商店(SUM(Amount_Paid)花了多少钱,或者即使我们想要查看每个客户每个订单花费的平均值(SUM(Amount_Paid) / COUNT(Order_Id))。

这只是一个简单的例子,可以在基本情况下显示GROUP BY的工作原理。但是,它不是为您尝试使用它而设计的。在某些情况下,它会消除重复记录(尽管DISTINCT可能会更容易,如果您正在尝试这样做),但它不适合查询输出的高级格式化。