1

I'm having trouble with my results of my count function, i think its due to the count(a1_journal.publisher_id) >=3 however instead of removing the results that are <3 from display it just gives them a null value.

Is there a way to either remove the null values from display (i tried a where col IS NOT NULL but it didn't work properly) or stop them from being selected in the count?

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;

Thanks

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

更新:

要选择出版商的名称,有两种方法。

  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 处理。就处理方式而言,它的效率也很低。如果数据集非常大,性能很可能会非常显着。

您有几种方法可以解决此问题。一种方法是重写连接并使用 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 回答