Mysql 非常复杂的SQL查询

Mysql 非常复杂的SQL查询,mysql,sql,complexity-theory,Mysql,Sql,Complexity Theory,我有一个复杂的问题,无法得到正确的答案。 共有3个表格: 联系人(pk作为INT,name作为VARCHAR,…) 会话(pkas INT,contactas INT,…) 消息(pk作为INT,会话作为INT,…) session.contact指向contact.pk。和message.session到session.pk 当session.contact为零时,则此行没有联系人联系人。pk从不为零 现在我想获取特定消息的所有名称。我的尝试是: 从message、session、contac

我有一个复杂的问题,无法得到正确的答案。
共有3个表格:

联系人(pk作为INT,name作为VARCHAR,…)
会话(pkas INT,contactas INT,…)
消息(pk作为INT,会话作为INT,…)

session.contact
指向
contact.pk
。和
message.session
session.pk

session.contact
为零时,则此行没有联系人<代码>联系人。pk从不为零

现在我想获取特定消息的所有名称。我的尝试是:

从message、session、contact中选择message.pk、contact.name,其中message.session=session.pk和session.contact=contact.pk


但是我没有得到正确的返回行数。应该是2459行,有2075行。

首先,您如何知道这是正确的行数

其次,您应该使用适当的
JOIN
语法,如下所示:

SELECT message.pk, contact.name
FROM message m
LEFT JOIN session s
    on m.session = s.pk
LEFT JOIN contact c
    on s.contact = c.pk

a) 这并不复杂。b) 你怎么知道正确答案是什么?这是一个考试题吗?我认为您需要加入有时没有条目的表(即您的示例中的
session.contact=contact.pk
不会找到匹配项)。您是否也在尝试获取没有联系人的记录?您当前的查询将无法获取这些信息。这可能是你的短处同意Marc的观点,我认为你在寻找表上的外部连接,在那里可能没有匹配的行太糟糕了,它不会改变他的results@Shredder没错,但让他们在未来走上正确的道路是个好主意,不是吗?@Shreder:Think@BlueFoots刚刚编辑了答案,将其包括在内,但是
LEFT JOIN
将改变他的结果。@如果他们发布一些示例数据,这将非常有助于确定正确的语法。