2017-10-27 4 views
0

オプションを選択して異なる製品をフィルタリングすることに関してこの質問がありました。そのクエリはここで解決されました:Filter products by options複数の結合を使用したページネーションカウントクエリ

私の問題は、ページングのカウントクエリになりました。たとえば、このクエリは1

SELECT COUNT(DISTINCT p.id) AS number 
FROM products p 
LEFT JOIN product_categories pc ON p.id = pc.product_id 
LEFT JOIN product_images pi ON p.id = pi.product_id 
LEFT JOIN product_options po ON p.id = po.product_id 
WHERE p.product_active = 1 
    AND po.option_id IN(1) 
    AND p.main_price BETWEEN 5250.00 AND 14000.00 
GROUP BY(p.id) 
HAVING COUNT(DISTINCT po.option_id) = 1 

のカウントが37行を返しますが、私はDISTINCT削除する場合:

SELECT COUNT(p.id) AS number 
FROM products p 
LEFT JOIN product_categories pc ON p.id = pc.product_id 
LEFT JOIN product_images pi ON p.id = pi.product_id 
LEFT JOIN product_options po ON p.id = po.product_id 
WHERE p.product_active = 1 
    AND po.option_id IN(1) 
    AND p.main_price BETWEEN 5250.00 AND 14000.00 
GROUP BY(p.id) 
HAVING COUNT(DISTINCT po.option_id) = 1 

をこれは、混合番号の37行を返します。

何が間違っていますか?私はこの結果セットの追加カウントを実行することでこれを達成することができますが、私はそれが正しい解決策ではないと思いますか?

また、以前の質問で示唆したように、私はDISTINCTを必要とすべきではないと言われました。そのためにクエリには問題があります。何が問題なのか教えていただけますか?

+0

あなたの質問は何ですか? 'GROUP BY(p.id)'を使うと37個の 'p.id'があるので37行を返します。これらのidには 'option_id'というものが1つしかありません。 –

答えて

0

これではっきりしています。これを解決するにはこのようなものがありますか?

SELECT COUNT(*) AS number 
FROM (SELECT p.id 
FROM products p 
LEFT JOIN product_categories pc ON p.id = pc.product_id 
LEFT JOIN product_images pi ON p.id = pi.product_id 
LEFT JOIN product_options po ON p.id = po.product_id 
WHERE p.product_active = 1 
    AND po.option_id IN(1) 
    AND p.main_price BETWEEN 5250.00 AND 14000.00 
GROUP BY(p.id) 
HAVING COUNT(DISTINCT po.option_id) = 1) AS count_table 

私はこれと一緒に行きます。ありがとう。

0

クエリの唯一の違いはここにある:

SELECT COUNT(DISTINCT p.id) AS number 

SELECT COUNT(p.id) AS number 

FROMWHERE、およびHAVINGはすべて同じであるので、あなたは、結果の行の同じ数を取得します。選択した行ごとのデータのみが異なります。

最初のケースでは、IDでグループ化されているため、常にnullではない別個のIDの数です。 (あなたは言う:ID 5のすべてのレコードを見て、これらのレコードで見つかったIDの数を数えます。ID 5のすべてのレコードのIDは5です)

あなたがヌルでないIDを数える場合。 IDがnullでないため、これはレコードのカウントと同じです:COUNT(*)。そして、これを難読化されたCOUNT(p.id)の代わりにCOUNT(*)を使用することで明確にする方がよいでしょう。

関連する問題