2017-09-18 4 views
0

次のクエリは、20行に制限された結果を返します。フィルタID 6が適用されていません。HAVINGを使用して合計行を取得します。

SELECT p.id, p.description 
FROM product p 
LEFT JOIN product_filter pf 
ON pf.product_id = p.id 
WHERE p.status = TRUE 
GROUP BY p.id 
HAVING SUM(pf.filter_id = '6') = 0 
ORDER BY p.description ASC 
LIMIT 0, 20 

これはうまく動作しますが、同じ条件の行の数を数えたいと思います。

SELECT COUNT(DISTINCT p.id) AS total 
FROM product p 
LEFT JOIN product_filter pf 
ON pf.product_id = p.id 
WHERE p.status = TRUE 
HAVING SUM(pf.filter_id = 6) = 0 

このクエリはゼロの結果を返します。

EDIT:要求されたとして、SQLFiddleより詳細な方法で問題を表示するのに役立ちます。

+0

あなたは明確な取り外しでそれを試してみましたか? –

+0

テーブル構造とサンプルデータはどこにありますか?あなたがより良い答えを提供するとき –

+0

@ RyanGadsdon、はいと私は同じ動作、結果を取得します。 – Linesofcode

答えて

0

@Raymond Nijlandの答えは、私の環境では、彼が提案したコードは動作しませんでした、が正しいですが。この記事を見てとることによって

COUNT(*) returning multiple rows instead of just one私はそれを実行して動作させるために管理します。

SELECT COUNT(DISTINCT p.id) AS total 
FROM (SELECT p2.id 
     FROM product AS p2 
     LEFT JOIN product_filter pf 
     ON pf.product_id = p2.id 
     GROUP BY p2.id 
     HAVING SUM(pf.filter_id = '6') = 0) As p 
+0

これはコメントか最終的な答え? –

+0

あなたのサブクエリはすでに 'GROUP BY id'を持っています' DISTINCT'を必要としません –

+0

@JuanCarlosOropezaの最終回答は、明日受け入れます。 – Linesofcode

2

GROUP BY p.idが見つかりませんでした。 GROUP BYなしのHAVINGは機能しません。

SELECT COUNT(DISTINCT p.id) AS total 
FROM product p 
LEFT JOIN product_filter pf 
ON pf.product_id = p.id 
WHERE p.status = TRUE 
GROUP BY p.id 
HAVING SUM(pf.filter_id = 6) = 0 

デモhttp://sqlfiddle.com/#!9/00b12/6

+0

私は以前に 'GROUP BY'節でテストしましたが、私の環境では動作しませんでした。なぜなら、私にはたくさんの行が与えられているからです。https://s26.postimg.org/bg3m3zdwp/notitle.png – Linesofcode

関連する問題