gpt4 book ai didi

mysql - 关系数据库JOIN返回过多的值

转载 作者:行者123 更新时间:2023-11-29 06:18:29 25 4
gpt4 key购买 nike

使用关系数据库时,我通常使用 INNER JOIN 连接表。从联接表中查询数据时,它会返回过多的值。作为说明,我创建了一个虚拟数据表,如下所示。

enter image description here

表序列是 Operation 可以有很多 daily,daily 可以有很多事件,每个事件都由其事件 UID 唯一。

通常我会使用 INNER JOIN,例如将 Operation 表与 Activity 表连接起来,以查询每个操作的类、阶段、操作、根的每个分割。但是它会返回过多的 Durationhrs。最坏的情况是,如果加入所有 3 个表(操作、每日、事件),它将返回令人难以置信的大量小时值。

我的问题是

  1. 我哪里做错了?
  2. 什么样的加入才能使其正确?
  3. 如果无法做到这一点,最好的加入方法是什么?

我的数据库是这样的

CREATE TABLE Operation
(`Operationuid` varchar(3), `operationname` varchar(10), `owner` varchar(55))
;

INSERT INTO operation
(`Operationuid`, `operationname`, `owner`)
VALUES
('AA1', 'Cow', 'Jon Letoy'),
('AA2', 'Chicken', 'Ridikill' ),
('AA3', 'Snake', 'Mighty'),
('AA4', 'Sheep', 'The great'),
('AA5', 'Pig', 'Peon');


CREATE TABLE Activity
(`Operationuid` varchar(3), `DailyUID` varchar(10), `ActivityUID` varchar(55), `Class` varchar(3), `Phase` varchar(3), `Ops` varchar(3), `Root` varchar(3), Duration int);

INSERT INTO Activity
(`Operationuid`, `DailyUID`, `ActivityUID`, `Class`, `Phase`, `Ops`, `Root`, `Duration`)
VALUES
('AA1', 'DD1', 'AC1', 'AB1', 'PH1', 'OP1', null, 12),
('AA1', 'DD1', 'AC2', 'AB1', 'PH2', 'OP1', null, 2),
('AA1', 'DD1', 'AC3', 'AB2', 'PH2', 'OP2', 'RR1', 3),
('AA1', 'DD1', 'AC4', 'AB3', 'PH3', 'OP3', null, 5),
('AA1', 'DD1', 'AC5', 'AB4', 'PH4', 'OP4', 'RR2', 1);

CREATE TABLE Daily
(`Operationuid` varchar(3), `DailyUID` varchar(10), `Dayno` varchar(55), `Daycost` decimal);

INSERT INTO Daily
(`Operationuid`, `DailyUID`, `Dayno`, `Daycost`)
VALUES
('AA1', 'DD1', 1, 1000),
('AA1', 'DD2', 2, 2000),
('AA1', 'DD3', 3, 3000),
('AA1', 'DD4', 4, 4000),
('AA1', 'DD5', 5, 5000);

Select operation.*, daily.*, activity.* from Operation
INNER JOIN daily on daily.operationUID=operatin.operationUID
INNER JOIN activity on activity.operationUID=operation.operationUID

这将返回 25 个结果,而不是我需要的 5 个结果,为什么?

最佳答案

您的 JOIN 有一点问题。您在此处加入了 Activity 表:INNER JOIN activity on activity.operationUID=activity.operationUID

您可能希望将其更正为:

Select operation.*, daily.*, activity.* from Operation
INNER JOIN daily on daily.operationUID=operation.operationUID
INNER JOIN activity on operation.operationUID=activity.operationUID

在这里查看它的工作情况:http://sqlfiddle.com/#!9/1a4ae9/8

在该结果中,您将看到 25 行结果。这是因为当您在没有 JOIN 操作的情况下查询许多表时,所涉及的表之间会发生笛卡尔平面,这将导致所有表中的行数相乘,在您的情况下,它将是 5*5*5。但是由于我们有 JOIN 操作,您会收到 operationdaily 表之间的等效性,因此 5 个注册表比您添加另一个 activity 连接 表有 5 个以上的注册表到 Operationuid 等于 AA1 因此它将导致每个注册表的第一个连接(每日操作)与所有注册表在事件 table 上。

关于mysql - 关系数据库JOIN返回过多的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34592928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com