复杂 SQL 计数查询

Posted

技术标签:

【中文标题】复杂 SQL 计数查询【英文标题】:Complex SQL Count Query 【发布时间】:2013-12-14 12:10:09 【问题描述】:

您好,我的作业被一个 SQL 查询卡住了,希望能得到一些帮助。

我需要获取执行效果最好的项目的项目 ID - (VERY_GOOD 记录数 + GOOD 记录数) - (VERY_BAD 记录数 + BAD 记录数) 最大的项目

我在数据库 (HSQLDB) 中的架构和测试记录

CREATE TABLE
    PROJECT
    (
        ID IDENTITY NOT NULL PRIMARY KEY,
        PROJECT_NAME VARCHAR(255) NOT NULL
    );

CREATE TABLE
    RECORD
    (
        ID IDENTITY NOT NULL PRIMARY KEY,
        RESULT VARCHAR(255) NOT NULL,
    );

CREATE TABLE
    RECORD_PROJECT
    (
        PROJECT_ID INTEGER NOT NULL,
        RECORD_ID INTEGER NOT NULL,
        PRIMARY KEY(PROJECT_ID, RECORD_ID),
        FOREIGN KEY (PROJECT_ID) REFERENCES PROJECT(ID) ON DELETE CASCADE,
        FOREIGN KEY (RECORD_ID) REFERENCES RECORD(ID)
    );  

以及测试数据:

INSERT INTO PROJECT (PROJECT_NAME) VALUES ('Bake a cake');
INSERT INTO PROJECT (PROJECT_NAME) VALUES ('Clean the house');

INSERT INTO RECORD (RESULT) VALUES ('GOOD');
INSERT INTO RECORD (RESULT) VALUES ('VERY_GOOD');
INSERT INTO RECORD (RESULT) VALUES ('VERY_GOOD');
INSERT INTO RECORD (RESULT) VALUES ('BAD');
INSERT INTO RECORD (RESULT) VALUES ('VERY_BAD');

INSERT INTO RECORD_PROJECT (PROJECT_ID, RECORD_ID) VALUES (0,0);
INSERT INTO RECORD_PROJECT (PROJECT_ID, RECORD_ID) VALUES (1,1);
INSERT INTO RECORD_PROJECT (PROJECT_ID, RECORD_ID) VALUES (1,2);
INSERT INTO RECORD_PROJECT (PROJECT_ID, RECORD_ID) VALUES (0,3);
INSERT INTO RECORD_PROJECT (PROJECT_ID, RECORD_ID) VALUES (1,4);

(我从表格中删除了不相关的字段)

因此,有了这些数据,我有 3 条好记录和 2 条坏记录,我需要获得“评级”最高的项目,根据目前的情况,这将是 Clean the house其他项目的 3 个好评超过 2 个差评。

也许有人会解决这个问题,谢谢!

【问题讨论】:

record.result 需要使用 char 吗? 身份?这对我来说是新的 记录是硬编码到数据库中的值,我也可以通过枚举来解决。对于结果,我只需要具有最佳结果的项目的 ID。 与您的问题无关,但 on delete 级联在错误的表中。 谢谢,但具体应该在哪里呢? 【参考方案1】:

这应该是 mysql-Dialect 中的(不是 testet)SQL:

SELECT rp.PROJECT_ID, p.PROJECT_NAME
   SUM(CASE WHEN rp.RECORD_ID < 3 THEN 1 ELSE 0 END) AS rating
FROM RECORD_PROJEKT AS rp
JOIN PROJECT AS p ON p.ID = rp.PROJECT_ID
GROUP BY rp.PROJECT_ID
ORDER BY rating DESC

【讨论】:

抱歉,我不明白这对我有什么帮助。 hsql 的语法似乎错误。 @Vaelyr 。 . .该问题被标记为“mysql”而不是“hsql”。 我认为如果您不包含 p.PROJECT_NAME,这应该适用于 HSQLDB。 SELECT rp.PROJECT_ID, SUM(CASE WHEN rp.RECORD_ID

以上是关于复杂 SQL 计数查询的主要内容,如果未能解决你的问题,请参考以下文章

在sql查询中计算距离(毕达哥拉斯)和运行计数

Oracle SQL - 将选择计数(*)转换为零或一

加入同一个表时 SQL 结果计数发生变化

用于计数的嵌套计数查询的 SQL 语法问题?

SQL 查询 - 两个计数不同的粒度

sql如何求分组计数之后计数的最大值