2017-06-15 13 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 | 
+----+-----------+--------------------+------------+--------+ 

はまた、私はこれらの2つのクエリがあります。

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 | 
+----+-----------+--------------------+------------+--------+ 

を今私は、これらの2つのクエリを結合したい、これが期待される結果である:

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

どうすれば実現できますか?そして、ここで私がこれまで間違っているしようとしたものです、それは常に1行を返します。

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

最初のクエリに2番目のクエリをクロス結合します。 – xQbert

答えて

2

私はあなたが正しく後に何をしているか理解しています。

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

ALTERNATE多分(未テスト)..トリックを行うshoudlクエリを結ぶ横断...しかし、再びサブクエリを...しかし、唯一の1句。

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)これら2つのクエリは同一であり、複雑な 'where'節があり、パフォーマンスを向上させ、結果を一度一致させようとしています。しかし、あなたの場合、まだあなたは2度選択しています。 –

+0

mySQLがwindow/analytical関数をサポートしていれば、これは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)これらの2つのクエリは同一で複雑な 'where'節があり、パフォーマンスを向上させ、結果を一度一致させようとしています。しかし、あなたの場合、まだあなたは2度選択しています。 –

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 
関連する問題