- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
再次使用 count 和 sql
在 sqlite 上,我有表格
inst 是一个机构表:大学等。writeby 中的每一行给出一篇论文、一位作者、该作者当时所属的机构。可以有多个机构,并且每个机构都会重复一对 paper_id、author_id。对于给定的作者,我想要一个包含 paper.doi、papers.year 的列表以及与他合作撰写论文的合作者数量。我试过了
SELECT papers.doi, papers.year, count(*) as c
FROM authors
INNER JOIN writtenby ON authors.author_id = writtenby.author_id
INNER JOIN writtenby AS writtenby_1 ON writtenby.paper_id =
writtenby_1.paper_id
INNER JOIN papers on writtenby_1.paper_id = papers.paper_id
WHERE authors.name ='Beck' AND authors.firstname= 'H P'
GROUP BY papers.doi, papers.year
ORDER BY c DESC
我遇到的问题可能是,如果我正在搜索的作者在给定论文中出现两次(因为有两个机构)计数加倍。对于给定的论文,预期结果为 2890,由行数给出
SELECT DISTINCT author_id
FROM writtenby
WHERE paper_id = 4593
(我的数据:2890 行)如果没有 unique,我将有 3023 行,上面的第一个查询给出的计数为 6046。我尝试在上面的 Count 子句中使用 DISTINCT,但这仍然不起作用。
我可以在子查询中使用 count 吗?感谢您的帮助...
示例数据:
-- Make the tables
CREATE TABLE 'authors' (name collate nocase, firstname collate nocase, see_id integer, 'author_id' INTEGER PRIMARY KEY NOT NULL );
CREATE TABLE 'inst' ('name' TEXT NOT NULL, 'country' TEXT NOT NULL , 'see_id' INTEGER, 'inst_id' INTEGER PRIMARY KEY NOT NULL );
CREATE TABLE 'papers' ('doi' TEXT NOT NULL,'year' TEXT NOT NULL, 'paper_id' INTEGER PRIMARY KEY NOT NULL );
CREATE TABLE 'writtenby' ('paper_id' INTEGER NOT NULL, 'author_id' INTEGER NOT NULL, 'inst_id' INTEGER NOT NULL, PRIMARY KEY ('paper_id', 'author_id', 'inst_id'));
-- Insert the data
-- authors : 5 names, one with 2 variants
INSERT INTO 'authors' (name, firstname, see_id, author_id) VALUES ('Doe', 'J', 1, 1);
INSERT INTO 'authors' (name, firstname, see_id, author_id) VALUES ('Klein', 'K', 2, 2);
INSERT INTO 'authors' (name, firstname, see_id, author_id) VALUES ('Lang', 'F', 3, 3);
INSERT INTO 'authors' (name, firstname, see_id, author_id) VALUES ('Rue', 'A De La', 6, 4);
INSERT INTO 'authors' (name, firstname, see_id, author_id) VALUES ('La Rue', 'A De', 6, 5);
INSERT INTO 'authors' (name, firstname, see_id, author_id) VALUES ('De La Rue', 'A', 6, 6);
INSERT INTO 'authors' (name, firstname, see_id, author_id) VALUES ('Smith', 'S', 7, 7);
-- inst 4 name, 2 variants
INSERT INTO 'inst' (name, country, see_id, inst_id) VALUES ('Universite de Paris', 'France', 1, 1);
INSERT INTO 'inst' (name, country, see_id, inst_id) VALUES ('Paris University', 'France', 1, 2);
INSERT INTO 'inst' (name, country, see_id, inst_id) VALUES ('Universite de Lyon', 'France', 3, 3);
INSERT INTO 'inst' (name, country, see_id, inst_id) VALUES ('Univ Freiburg', 'Germany', 4, 4);
INSERT INTO 'inst' (name, country, see_id, inst_id) VALUES ('EPFZ', 'Switzerland', 5, 5);
INSERT INTO 'inst' (name, country, see_id, inst_id) VALUES ('Eidg Techn Hochschule', 'Switzerland', 5, 6);
-- papers: 3 papers
INSERT INTO 'papers' (doi, year, paper_id) VALUES ('doi1', '2017', 1);
INSERT INTO 'papers' (doi, year, paper_id) VALUES ('doi2', '2018', 2);
INSERT INTO 'papers' (doi, year, paper_id) VALUES ('doi3', '2018', 3);
-- paper 1: 4 authors
INSERT INTO 'writtenby' (paper_id, author_id, inst_id) VALUES (1, 6, 1);
INSERT INTO 'writtenby' (paper_id, author_id, inst_id) VALUES (1, 6, 3);
INSERT INTO 'writtenby' (paper_id, author_id, inst_id) VALUES (1, 1, 5);
INSERT INTO 'writtenby' (paper_id, author_id, inst_id) VALUES (1, 2, 4);
INSERT INTO 'writtenby' (paper_id, author_id, inst_id) VALUES (1, 7, 1);
-- paper 2: 3 authors
INSERT INTO 'writtenby' (paper_id, author_id, inst_id) VALUES (2, 6, 1);
INSERT INTO 'writtenby' (paper_id, author_id, inst_id) VALUES (2, 6, 3);
INSERT INTO 'writtenby' (paper_id, author_id, inst_id) VALUES (2, 1, 5);
INSERT INTO 'writtenby' (paper_id, author_id, inst_id) VALUES (2, 2, 5);
-- paper 3: 3 authors
INSERT INTO 'writtenby' (paper_id, author_id, inst_id) VALUES (3, 6, 1);
INSERT INTO 'writtenby' (paper_id, author_id, inst_id) VALUES (3, 2, 4);
INSERT INTO 'writtenby' (paper_id, author_id, inst_id) VALUES (3, 6, 3);
INSERT INTO 'writtenby' (paper_id, author_id, inst_id) VALUES (3, 2, 1);
INSERT INTO 'writtenby' (paper_id, author_id, inst_id) VALUES (3, 3, 4);
INSERT INTO 'writtenby' (paper_id, author_id, inst_id) VALUES (3, 3, 5);
INSERT INTO 'writtenby' (paper_id, author_id, inst_id) VALUES (3, 3, 1);
检查查询:
SELECT papers.doi, papers.year, count(*) as c
FROM authors
INNER JOIN writtenby ON authors.author_id = writtenby.author_id
INNER JOIN writtenby AS writtenby_1 ON writtenby.paper_id =
writtenby_1.paper_id
INNER JOIN papers on writtenby_1.paper_id = papers.paper_id
WHERE authors.name ='De La Rue' AND authors.firstname= 'A'
GROUP BY papers.doi, papers.year
ORDER BY c DESC
SELECT p.doi, p.year, COUNT(w2.author_id) AS cnt
FROM authors a
INNER JOIN writtenby w1
ON a.author_id = w1.author_id
INNER JOIN writtenby w2
ON w1.paper_id = w2.paper_id AND w1.author_id <> w2.author_id
INNER JOIN papers p
ON w2.paper_id = p.paper_id
WHERE
a.name = 'De La Rue' AND a.firstname = 'A'
GROUP BY
p.doi, p.year
ORDER BY
cnt DESC;
两个查询都给出了错误的结果第一个:
doi3|2018|14
doi1|2017|10
doi2|2018|8
第二个查询
doi3|2018|10
doi1|2017|6
doi2|2018|4
弗朗索瓦
最佳答案
我发现正在发生的一个计数问题是在 writingby
表的自联接中。在那里,您不会检查匹配行是否具有不同 author_id
。如果 author_id
相同,那么您不应该计算它。此外,您应该计算第二个 writingby
表的共享作者数量。这样,如果给定作者没有任何共同作者,计数将显示为零。
SELECT p.doi, p.year, COUNT(w2.author_id) AS cnt
FROM authors a
INNER JOIN writtenby w1
ON a.author_id = w1.author_id
INNER JOIN writtenby w2
ON w1.paper_id = w2.paper_id AND w1.author_id <> w2.author_id
INNER JOIN papers p
ON w2.paper_id = p.paper_id
WHERE
a.name = 'Beck' AND a.firstname = 'H P'
GROUP BY
p.doi, p.year
ORDER BY
cnt DESC;
关于SQL:计数和子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54111382/
我有三张 table 。表 A 有选项名称(即颜色、尺寸)。表 B 有选项值名称(即蓝色、红色、黑色等)。表C通过将选项名称id和选项名称值id放在一起来建立关系。 我的查询需要显示值和选项的名称,而
在mysql中,如何计算一行中的非空单元格?我只想计算某些列之间的单元格,比如第 3-10 列之间的单元格。不是所有的列...同样,仅在该行中。 最佳答案 如果你想这样做,只能在 sql 中使用名称而
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我正在为版本7.6进行Elasticsearch查询 我的查询是这样的: { "query": { "bool": { "should": [ {
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
是否可以编写一个查询来检查任一子查询(而不是一个子查询)是否正确? SELECT * FROM employees e WHERE NOT EXISTS (
我找到了很多关于我的问题的答案,但问题没有解决 我有表格,有数据,例如: Data 1 Data 2 Data 3
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
我从 EditText 中获取了 String 值。以及提交查询的按钮。 String sql=editQuery.getText().toString();// SELECT * FROM empl
我有一个或多或少有效的查询(关于结果),但处理大约需要 45 秒。这对于在 GUI 中呈现数据来说肯定太长了。 所以我的需求是找到一个更快/更高效的查询(几毫秒左右会很好)我的数据表大约有 3000
这是我第一次使用 Stack Overflow,所以我希望我以正确的方式提出这个问题。 我有 2 个 SQL 查询,我正在尝试比较和识别缺失值,尽管我无法将 NULL 字段添加到第二个查询中以识别缺失
什么是动态 SQL 查询?何时需要使用动态 SQL 查询?我使用的是 SQL Server 2005。 最佳答案 这里有几篇文章: Introduction to Dynamic SQL Dynami
include "mysql.php"; $query= "SELECT ID,name,displayname,established,summary,searchlink,im
我有一个查询要“转换”为 mysql。这是查询: select top 5 * from (select id, firstName, lastName, sum(fileSize) as To
通过我的研究,我发现至少从 EF 4.1 开始,EF 查询上的 .ToString() 方法将返回要运行的 SQL。事实上,这对我来说非常有用,使用 Entity Framework 5 和 6。 但
我在构造查询来执行以下操作时遇到问题: 按activity_type_id过滤联系人,仅显示最近事件具有所需activity_type_id或为NULL(无事件)的联系人 表格结构如下: 一个联系人可
如何让我输入数据库的信息在输入数据 5 分钟后自行更新? 假设我有一张 table : +--+--+-----+ |id|ip|count| +--+--+-----+ |
我正在尝试搜索正好是 4 位数字的 ID,我知道我需要使用 LENGTH() 字符串函数,但找不到如何使用它的示例。我正在尝试以下(和其他变体)但它们不起作用。 SELECT max(car_id)
我有一个在 mysql 上运行良好的 sql 查询(查询 + 连接): select sum(pa.price) from user u , purchase pu , pack pa where (
我是一名优秀的程序员,十分优秀!