SELECT t.*,count(tbl_myr_share_comment.shareId) as count FROM
`tbl_myr_share` `t` LEFT JOIN tbl_myr_share_comment ON
tbl_myr_share_comment.shareId=t.shareId WHERE t.userId=1 ORDER BY
t.shareId DESC LIMIT 10;
明明数据库有4条数据,但是查询的结果出来是一条数据。
SELECT t.*,count(tbl_myr_share_comment.shareId) as count FROM
`tbl_myr_share` `t` LEFT JOIN tbl_myr_share_comment ON
tbl_myr_share_comment.shareId=t.shareId WHERE t.userId=1 GROUP BY
t.shareId ORDER BY t.shareId DESC LIMIT 10
但是我后面加一个group by则得到了正确的数据。
请问为什么有count的情况下加group 才能得到正确的数据呢?
大概扫了一眼, 应该是犯了一个基本的错误:
sql在做分组计算的时候, select, having, order by里的列 一般来说, 必须是 "group by分组的列", 或者是 "聚集函数(别的列)" 这种形式.
具体说, select sum(a), b from table group by b; 是对的;
select * from table group by b 这种一般是错的(标准sql会报错, mysql不会, 但不代表就是对的)
你的第一个sql, 既然用到了count(), 那么就是把整张表作为一个分组来处理了.
这要针对数据表的具体情况进行分析,给你一些Group By
的资料,其实思想很简单,自己好好琢磨一下,一定能思明白的!
GROUP BY 语句
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
SQL GROUP BY 语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
SQL GROUP BY 实例
我们拥有下面这个 "Orders" 表:
O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter
现在,我们希望查找每个客户的总金额(总订单)。
我们想要使用 GROUP BY 语句对客户进行组合。
我们使用下列 SQL 语句:
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
结果集类似这样:
Customer SUM(OrderPrice)
Bush 2000
Carter 1700
Adams 2000
很棒吧,对不对?
让我们看一下如果省略 GROUP BY 会出现什么情况:
SELECT Customer,SUM(OrderPrice) FROM Orders
结果集类似这样:
Customer SUM(OrderPrice)
Bush 5700
Carter 5700
Bush 5700
Bush 5700
Adams 5700
Carter 5700
上面的结果集不是我们需要的。
那么为什么不能使用上面这条 SELECT 语句呢?解释如下:上面的 SELECT
语句指定了两列(Customer
和 SUM(OrderPrice)
)。SUM(OrderPrice)
返回一个单独的值(OrderPrice
列的总计),而 Customer
返回 6 个值(每个值对应 Orders
表中的每一行)。因此,我们得不到正确的结果。不过,您已经看到了,GROUP BY
语句解决了这个问题。