0

我以这种方式构建了 2 个表:

Trips
- id
- organization_id REQUIRED
- collaboration_organization_id OPTIONAL
...other useless fields...

Organizations
- id
- name REQUIRED
...other useless fields...

现在我被要求创建这种类型的报告:

我想要每个组织的所有旅行的总和,考虑到如果他们有一个collaboration_organization_id 它应该算作0.5,显然collaboration_organization_id 中的组织也得到+0.5

因此,每当我有一个设置了组织 ID 和协作组织 ID 的旅行时,这两个组织的旅行都算作 0.5。如果只设置了 organization_id,则它计为 1。

现在我的问题由两部分组成:

1.

在 SQL 中“解决”所有问题是一个好主意吗?

我已经知道如何通过代码解决它,我的想法目前是“选择所有行程(仅这 3 个字段)并开始计算 ruby​​”。请考虑我在 Rails 上使用 ruby​​,所以仍然可以说“不,因为它只能在 mysql 上工作”。

2.

如果第 1 点是“是”,我不知道如何在每次需要的地方计算 0.5,因为 count 是一个“投入即做”功能

4

1 回答 1

2

我对 ruby​​ on rails 不熟悉,但这是你可以用 MySQL 做到这一点的方法。

样本数据:

CREATE TABLE Trips(
  id int not null primary key,
  organization_id int not null,
  collaboration_organization_id int null
  );

INSERT INTO Trips (id,organization_id,collaboration_organization_id)
VALUES
(1,1,5),
(2,1,1),
(3,1,2),
(4,11,1),
(5,1,null),
(6,2,null),
(7,10,null),
(8,6,2),
(9,1,3),
(10,1,4);

MySQL 查询:

SELECT organization_id,
sum(CASE WHEN collaboration_organization_id IS null THEN 1 ELSE 0.5 End) AS number
FROM Trips
GROUP BY organization_id;

通过以下方式试用:http ://www.sqlfiddle.com/#!2/1b01d/107

编辑:添加协作组织

样本数据:

  CREATE TABLE Trips(
  id int not null primary key,
  organization_id int not null,
  collaboration_organization_id int null
  );

INSERT INTO Trips (id,organization_id,collaboration_organization_id)
VALUES
(1,1,5),
(2,1,1),
(3,1,2),
(4,11,1),
(5,1,null),
(6,2,null),
(7,10,null),
(8,6,2),
(9,1,3),
(10,1,4);


CREATE TABLE Organizations(
  id int auto_increment primary key,
  name varchar(30)
  );

INSERT INTO Organizations (name)
VALUES
("Org1"),
("Org2"),
("Org3"),
("Org4"),
("Org5"),
("Org6"),
("Org7"),
("Org8"),
("Org9"),
("Org10"),
("Org11"),
("Org12"),
("Org13"),
("Org14"),
("Org15"),
("Org16");

MySQL查询:

SELECT O.id, O.name,
sum(CASE WHEN T.collaboration_organization_id IS null THEN 1 ELSE 0.5 End) AS number
FROM Organizations AS O LEFT JOIN Trips AS T  
ON T.organization_id = O.id OR T.collaboration_organization_id = O.id
WHERE T.collaboration_organization_id = O.id OR O.id = T.organization_id
GROUP BY O.id;

http://www.sqlfiddle.com/#!2/ee557/15

于 2013-01-16T23:01:14.110 回答