1

count関数の結果に問題があります。これは、count(a1_journal.publisher_id)> = 3が原因だと思いますが、3未満の結果を表示から削除する代わりに、null値を返すだけです。

null値を表示から削除する(colがNULLではない場所を試しましたが、正しく機能しませんでした)か、カウントでそれらが選択されないようにする方法はありますか?

SELECT publisher_name, (select count(a1_journal.publisher_id)
FROM a1_journal
WHERE a1_journal.publisher_id=a1_publisher.publisher_id 
HAVING count(a1_journal.publisher_id) >=3)
AS Number_of_Journals
FROM a1_publisher
ORDER by Number_of_Journals DESC;

ありがとう

4

2 に答える 2

3

問題は、テーブルa1_publisherのすべての行を返すことです。代わりにこれを試してください。

select j.publisher_id, count(j.publisher_id)
FROM a1_journal j inner join a1_publisher p ON  j.publisher_id=p.publisher_id 
GROUP BY j.publisher_id
HAVING count(j.publisher_id) >=3
ORDER BY count(j.publisher_id) DESC

アップデート:

出版社の名前を選択するには、2つの方法があります。

  1. 出版社の名前が一意の場合は、次のように列をグループに追加できます

    select j.publisher_id,p.publisher_name, count(j.publisher_id)
    FROM a1_journal j 
      inner join a1_publisher p ON  j.publisher_id=p.publisher_id 
    GROUP BY j.publisher_id, p.publisher_name
    HAVING count(j.publisher_id) >=3
    ORDER BY count(j.publisher_id) DESC
    
  2. 一意でない場合は、このようにa1_publisherと別の結合を行う必要があります。

    SELECT aj.publisher_id, aj.numberOfJournals, ap.publisher_name
    FROM a1_publisher ap 
    INNER JOIN (
        SELECT j.publisher_id, count(j.publisher_id) numberOfJournals
        FROM a1_journal j 
           inner join a1_publisher p ON  j.publisher_id=p.publisher_id 
        GROUP BY j.publisher_id
        HAVING count(j.publisher_id) >=3  ) aj 
    ON ap.publisher_id = ap.publisher_id
    ORDER BY count(j.publisher_id) DESC
    
于 2012-08-21T08:25:36.177 に答える
0

あなたのクエリは、あなたが作成した方法で、副選択内のCOUNTを気にしません。何があっても、すべてのpublisher_nameに対して処理されます。また、処理方法の点でも非効率的です。データセットが非常に大きい場合のパフォーマンスは、おそらく非常に顕著です。

これを修正する方法はいくつかあります。1つの方法は、結合に書き直し、COUNT()関数を使用して、次のようにジャーナルの数を集計することです。

SELECT
    a1_publisher.publisher_name,
    COUNT(a1_journal.publisher_id) AS Number_of_Journals
FROM
    a1_publisher
INNER JOIN a1_publisher
    ON a1_journal.publisher_id = a1_publisher.publisher_id
GROUP BY
    a1_publisher.publisher_name
HAVING
    COUNT(a1_journal.publisher_id) >= 3 -- Here is your filter.
ORDER BY
    COUNT(a1_journal.publisher_id) DESC, a1_publisher.publisher_name ;

ジャーナルのない出版社を見つけたい場合は、少し変更することができます。

SELECT
    a1_publisher.publisher_name
FROM
    a1_publisher
LEFT  JOIN a1_publisher
    ON a1_journal.publisher_id = a1_publisher.publisher_id
WHERE
    a1_journal.pubhslier_id IS NULL
ORDER BY
    a1_publisher.publisher_name

パフォーマンス上の理由から、a1_journal.publisher_idにインデックスを作成し、a1_publisher.publisher_idにインデックスを作成します(これはすでに主キーであると思われますが)

于 2012-08-21T08:30:37.893 に答える