2017-06-15 87 views
0

这里是我的表:我如何计算总体结果并将它们分组?

// posts 
+----+-----------+--------------------+------------+--------+ 
| id | title |  body  | author_id | amount | 
+----+-----------+--------------------+------------+--------+ 
| 1 | post1  | somthing   | 2543  | 5000 | 
| 2 | post2  | something else  | 4352  | NULL | 
| 3 | post3  | whatever   | 1563  | 1200 | 
| 4 | post4  | test context  | 7234  | NULL | 
| 5 | post5  | anything ...  | 4352  | NULL | 
+----+-----------+--------------------+------------+--------+ 

另外我有两个疑问:

SELECT COUNT(*), COUNT(amount) FROM posts 
+----------+---------------+ 
| COUNT(*) | COUNT(amount) | 
+----------+---------------+ 
| 5  | 2    | 
+----------+---------------+ 

SELECT * FROM posts ORDER BY id LIMIT 0,2 
+----+-----------+--------------------+------------+--------+ 
| id | title |  body  | author_id | amount | 
+----+-----------+--------------------+------------+--------+ 
| 1 | post1  | somthing   | 2543  | 5000 | 
| 2 | post2  | something else  | 4352  | NULL | 
+----+-----------+--------------------+------------+--------+ 

现在,我想这两个查询组合,这是预期的结果:

+----+-----------+--------------------+------------+--------+----------+---------------+ 
| id | title |  body  | author_id | amount | COUNT(*) | COUNT(amount) | 
+----+-----------+--------------------+------------+--------+----------+---------------+ 
| 1 | post1  | somthing   | 2543  | 5000 | 5  | 2    | 
| 2 | post2  | something else  | 4352  | NULL | 5  | 2    | 
+----+-----------+--------------------+------------+--------+----------+---------------+ 

我该如何做到这一点?这是我迄今为止尝试过的错误,它总是返回一行:

SELECT x.*, COUNT(*), COUNT(amount) 
FROM (
    SELECT * FROM posts ORDER BY id 
) x 
LIMIT 0,2 
+0

将第二个查询交叉连接到第一个。 – xQbert

回答

2

如果我明白你的想法是正确的。交叉连接查询shoudl这样的伎俩..

SELECT * 
FROM posts p 
CROSS JOIN (SELECT COUNT(*) cnt, COUNT(amount) cntamt FROM posts) t 
ORDER BY p.id 
LIMIT 0,2 

ALTERNATE也许(未经测试)......但是同样有一个子查询......但只有1 where子句。

SELECT id, title, body, author_id, max(cnt) cnt, max(cntAmount) cntAmount 
FROM (SELECT id 
      , title 
      , body 
      , author_id 
      , @[email protected]+1 as cnt 
      , case when Amount is not null then @cntamt:[email protected]+1 else @cntAmt end as cntAmount 
     FROM posts p 
     CROSS JOIN (SELECT @cnt:=0,@cntAmt:=0) t 
     GROUP BY id, title, body, author_id) Z 
ORDER BY z.id 
LIMIT 0,2 
+0

那么[现实](https://stackoverflow.com/questions/44566376/how-can-i-use-sub-query-to-count-the-result-before-limiting)这两个查询有一个相同的复杂'where'子句,我试图提高性能并匹配一次结果。但就你而言,你仍然选择两次。 –

+0

如果mySQL支持窗口/分析函数,那么这可以在1个查询中实现。但是,它没有。 – xQbert

+0

谢谢。你为什么在'select'语句中使用所有列的名字?为什么不只是'*'? –

2

你可以用CROSS JOIN来做到这一点。像这样:

SELECT 
    posts.*, 
    tbl.nbr, 
    tbl.nbrAmount 
FROM 
    posts 
CROSS JOIN 
    (SELECT COUNT(*) as nbr, COUNT(amount) as nbrAmount FROM posts) AS tbl 
ORDER BY id LIMIT 0,2 
+0

那么[现实](https://stackoverflow.com/questions/44566376/how-can-i-use-sub-query-to-count-the-result-before-limiting)这两个查询有一个相同的复杂'where'子句,我试图提高性能并匹配一次结果。但就你而言,你仍然选择两次。 –

0

使用加入你可以结合这一点。

SELECT p1.*,p2.* FROM posts AS p1 
LEFT JOIN (
    SELECT COUNT(*), COUNT(amount) FROM posts 
) AS p2 ON 1=1 
ORDER BY p1.id LIMIT 0,2