Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL自连接是如何工作的?_Mysql - Fatal编程技术网

MYSQL自连接是如何工作的?

MYSQL自连接是如何工作的?,mysql,Mysql,我最近问了一个关于自联接的问题,我得到了一个很好的答案 查询的目的是查找Event2的ID、开始日期和价格,在Event1之后1天 代码运行良好但我不明白怎么做。 有人能尽可能彻底地解释一下——查询的不同部分是什么,它们是做什么的 SELECT event2.id, event2.startdate, event2.price FROM mm_eventlist_dates event1 JOIN mm_eventlist_dates event2 ON event2.startdate =

我最近问了一个关于自联接的问题,我得到了一个很好的答案

查询的目的是查找Event2的ID、开始日期和价格,在Event1之后1天

代码运行良好但我不明白怎么做。

有人能尽可能彻底地解释一下——查询的不同部分是什么,它们是做什么的

SELECT event2.id, event2.startdate, event2.price
FROM mm_eventlist_dates event1
JOIN mm_eventlist_dates event2 
ON event2.startdate = date_add(event1.enddate, INTERVAL 1 DAY)
WHERE event1.id=$id

我真的很感谢你的帮助,不管出于什么原因,我都很难理解这件事

我试图理解这一点的方式是在第一部分中列出两个列表,一个标签为event1,另一个标签为event2。然后在每个列表中列出一些记录(列表将是相同的),现在从下面描述中的WHERE开始

我们从两个表中获取数据(好的,同一个表使用了两次,但暂时忽略它)

自下而上阅读其余部分可能会有所帮助

  WHERE event1.id=$id
因此,我们希望event1中的记录具有指定的记录id。这可能正好是一条记录。现在我们计算出事件结束后的第二天

 date_add(event1.enddate, INTERVAL 1 DAY)
现在这告诉我们事件2的记录,他们需要从那个日期开始

ON event2.startdate = date_add(event1.enddate, INTERVAL 1 DAY)
我们现在已经确定了两个记录,需要哪些字段

SELECT event2.id, event2.startdate, event2.price

哦,只有我们计算出开始日期的字段。

当您在查询中创建联接时,实际上就是在这样做——将两个表联接在一起。这可以是两个不同的表或两个相同的表,这并不重要。指定联接时,如果表不同,则为表创建别名(在查询的其余部分中引用该别名的名称)非常有用,如果表相同,则创建别名非常重要。您的查询采用表1(event1),其中包含以下列:

event1.id, event1.startdate, event1.price
和连接表2(事件2):

这将为您留下结果集:

event1.id, event1.startdate, event1.price, event2.id, event2.startdate, event2.price
联接的条件指定为:

ON event2.startdate = date_add(event1.enddate, INTERVAL 1 DAY)
这表示“对于event1中的每一行,加入event2中startdate为event1中startdate后1天的行”

然后,由于您只对一个事件的数据感兴趣,where子句限制了结果集

WHERE event1.id=$id
最后,由于您不需要event1中有关原始事件的信息,因此select语句只需从resultset中选择event2列:

SELECT event2.id, event2.startdate, event2.price

自联接通过使用不同的选择条件两次引用同一个表来工作。将对表的每个引用视为通过过滤原始表创建的不同“虚拟表”。通常,其中一个表使用WHERE子句进行“筛选”,第二个表在join子句中进行“筛选”。这是最有效的方法,也可以在join子句中“过滤”这两种方法

因此,我们有两个基于同一基础表中数据的虚拟表,它们连接在一起,就像它们是两个完全独立的表一样

问题的关键在于,您将数据存储在一个表中,该表根据上下文具有稍微不同的含义

考虑一个人员表,每个人都有一个唯一的id,还有一列是父亲

    id   name    fatherID
    1    Joseph  [null]
    2    Greg     1

    SELECT child.name as childName, father.name as fatherName
        FROM people as child
        INNER JOIN people as father on (child.fatherID = father.id)  
将产生1行

    childName   fatherName
    Greg       Joseph

联接根据特定条件组合两个表。标准是ON条款之后的内容

如果将a表与其自身联接,则实际上与创建表的副本、重命名该表并使用该副本执行联接相同

比如说

Table foo Table bar +---+---+---+ +---+---+---+ | a | b | c | | a | d | e | +---+---+---+ +---+---+---+ | 1 | 2 | 3 | | 1 | 0 | 0 | +---+---+---+ +---+---+---+ | 1 | 3 | 4 | | 2 | 9 | 3 | +---+---+---+ +---+---+---+ | 1 | 3 | 5 | +---+---+---+ | 2 | 4 | 6 | +---+---+---+ 我们最终的结局是

foo join bar on (foo.a = bar.a and foo.c > 4) +---+---+---+---+---+ | a | b | c | d | e | +---+---+---+---+---+ | 1 | 3 | 5 | 0 | 0 | +---+---+---+---+---+ | 2 | 4 | 6 | 9 | 3 | +---+---+---+---+---+ 该查询遵循相同的原则,但有两个mm_eventlist_dates表实例,一个别名为event1,另一个别名为event2。我们可以将其视为拥有两个表并执行连接,就像在实际的两个表场景中一样

本例中的联接条件是,对于表event2,startdate与表event1的enddate加上一天相匹配


where子句限制执行的联接,在本例中,它仅对具有所提供id的event1表的行执行联接。

假设event1和event2是两个完全不相关的表,恰好包含完全相同的数据。感谢您的帮助。谢谢,你的回答很有帮助。这是我能要求的最简单的例子。非常感谢你。 Table foo Table bar +---+---+---+ +---+---+---+ | a | b | c | | a | d | e | +---+---+---+ +---+---+---+ | 1 | 2 | 3 | | 1 | 0 | 0 | +---+---+---+ +---+---+---+ | 1 | 3 | 4 | | 2 | 9 | 3 | +---+---+---+ +---+---+---+ | 1 | 3 | 5 | +---+---+---+ | 2 | 4 | 6 | +---+---+---+
select * from foo join bar on (foo.a = bar.a and foo.c > 4)
foo join bar on (foo.a = bar.a and foo.c > 4) +---+---+---+---+---+ | a | b | c | d | e | +---+---+---+---+---+ | 1 | 3 | 5 | 0 | 0 | +---+---+---+---+---+ | 2 | 4 | 6 | 9 | 3 | +---+---+---+---+---+
SELECT event2.id, event2.startdate, event2.price 
FROM mm_eventlist_dates event1                     
JOIN mm_eventlist_dates event2 
ON event2.startdate = date_add(event1.enddate, INTERVAL 1 DAY)
WHERE event1.id=$id