sqlite: count и group by дает не ожидаемый результат - PullRequest
0 голосов
/ 13 ноября 2018

на sqlite, у меня есть таблицы

papers: rero_id, doi, year
writtenby: rero_id, authorid, instid
authors: author_id, name, firstname
inst: inst_id, name, see_id

inst - это таблица институтов: университетов и так далее.Каждая строка в письменном виде дает бумагу, автора, учреждение, к которому этот автор был прикреплен в то время.Может быть больше чем одно учреждение и парная бумага, авторид повторяется для каждого учреждения.Для данного автора я хочу получить список и список учреждений, с которыми он сотрудничал.Для списка, который я пробовал

SELECT  inst.name as loc
FROM (
(authors INNER JOIN writtenby ON authors.authorid = 
      writtenby.authorid) 
      INNER JOIN writtenby AS writtenby_1 ON writtenby.rero_id = 
       writtenby_1.rero_id

 ) 

 INNER JOIN authors AS auth_1 ON writtenby_1.authorid = 
 auth_1.authorid
 inner join inst on  writtenby_1.instid = inst.inst_id 

 WHERE (authors.name) ="Doe" AND (authors.firstname)= "Joe"
 ORDER BY loc

Я получил список, который выглядит нормально.

Теперь я хотел бы перегруппировать названия этих учреждений и подсчитать их.Я пробовал

 SELECT  inst.name, count(inst.name)
 FROM (
    (authors INNER JOIN writtenby ON authors.authorid = 
     writtenby.authorid) 
     INNER JOIN writtenby AS writtenby_1 ON writtenby.rero_id = 
     writtenby_1.rero_id

 ) 

 INNER JOIN authors AS auth_1 ON writtenby_1.authorid = 
 auth_1.authorid
 inner join inst on  writtenby_1.instid = inst.inst_id 
 GROUP BY inst.name
 HAVING (authors.name) ="Doe" AND (authors.firstname)= "John"

У меня всего три строки, а не количество учреждений, перечисленных в первом запросе.Спасибо, что поправили меня!

Франсуа

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Я получил это, что работает,

SELECT inst.name as loc, count(*) as c
FROM (
(authors INNER JOIN writtenby ON authors.authorid = writtenby.authorid) 
INNER JOIN writtenby AS writtenby_1 ON writtenby.rero_id = 
writtenby_1.rero_id
inner join inst on  writtenby_1.instid = inst.inst_id 
) 
INNER JOIN authors AS auth_1 ON writtenby_1.authorid = auth_1.authorid
WHERE (authors.name) ="Doe" AND (authors.firstname)= "John"
GROUP BY inst.name
ORDER BY c DESC

Я все еще могу использовать предложение where, и это не то же самое, что иметь ... И благодаря fa6 , который дал ответниже F.

0 голосов
/ 13 ноября 2018

Попробуйте использовать где вместо

 SELECT  inst.name, count(inst.name)
 FROM (
    (authors INNER JOIN writtenby ON authors.authorid = 
     writtenby.authorid) 
     INNER JOIN writtenby AS writtenby_1 ON writtenby.rero_id = 
     writtenby_1.rero_id

 ) 

 INNER JOIN authors AS auth_1 ON writtenby_1.authorid = 
 auth_1.authorid
 inner join inst on  writtenby_1.instid = inst.inst_id 
 where authors.name ='Doe' AND authors.firstname= 'John' 
 GROUP BY inst.name
...