MySQL拉所有记录连接问题

问题描述:

我有一个奇怪的情况。我还没有找到解决方案。我尝试过使用各种连接和子查询,所以我需要一些帮助。我使用MySQLi和PHP 7.MySQL拉所有记录连接问题

我有两个表。一个表格(称为表格)包含人员列表。另一个表格包含该人员完成的称为报告的数据日志。

我可以毫无问题地从每张表中清楚地选择所有记录。 我能够使用连接语句来拉只有在这两个表中的记录

我想完成的是一个查询,将拉取所有记录,但也加入报表中的数据,而只显示如果适用,最新报告加入报告。

工作的一个例子连接查询:

select * from table 

join reports on (table.ID = reports.ID) 
join contacts on (reports.cID = contacts.cID) 

where date(reports.dTime) = date(curdate()) and reports.Method = $methodID 

修改后的查询不工作的一个例子。我明白我可能需要使用子查询作为我的逻辑是有缺陷的,或不工作,我怎么想它会

select * from table 

join reports on (table.ID = reports.ID) 
join contacts on (reports.cID = contacts.cID) 

where date(reports.dTime) = date(curdate()) and reports.Method = $methodID OR table.Method = $method 

我一直在使用LEFT OUTER JOIN按照MySQL文档尝试,但不能似乎让它包含来自表格的所有记录和来自报告的任何可能的数据。

select * from table 

left outer join reports on (table.ID = reports.ID) 

where date(reports.dTime) = date(curdate()) and reports.Method = $methodID 

有什么我做错了吗?或者是我对联接缺乏的把握?

感谢您提供任何帮助。


编辑 - 我只是意识到我不可能被报告时间或方法排序或订单,因为这些可能不存在,我不需要在此查询排序的功能。也许按照table.timestamp排序。


编辑2 - 添加预期结果的一个例子:

table 
------------------------------------- 
firstName | last Name | cID | dTime 
------------------------------------- 
Jane  | Doe  | 312 | 10:30am 
John  | Doe  | 318 | 10:35am 
Adam  | Doe  | | 
Berry  | Doe  | | 
Charlie | Doe  | | 

表表包含有关的人,如姓名,年龄等的接触表只包含联系人ID的各种数据(CID )和联系人姓名。报表包含dTime,以及与该联系人表中的ContactID对应的该dTime的cid。联系人ID是唯一的。

+2

你试图达到的目标还有点不清楚。如果你可以添加一些示例数据和预期的结果,这将有所帮助。这听起来像是一个左连接是你需要的,它会给你所有的表行,加上来自连接表的所有可用信息 –

+0

我会这么做 - 编辑现在 –

+0

@我的人我已经按要求编辑了问题 –

如果我理解正确的数据,下面的查询应该给你你正在寻找的结果:

SELECT t.firstName, t.lastName, c.id, r.dTime 
FROM Table t 
LEFT JOIN reports r ON r.id = t.id 
LEFT JOIN contacts c ON c.id = r.cId 

表和报告之间的关系似乎并没有被正确设置,除非你是简化你的实际结构。正如Binarus指出的那样,您应该在Reports表中将一个tid列存储为一个外键。

首先,你应该总是提供真实的你使用的代码。正如你所看到的(参见@Jay Blanchard的评论),如果你随机发布或改变名字,你将会犯错误。

毕竟,你在这里发布是因为你在某处发生错误,而错误将发生在你不期望的地方。否则,你会自己找到它。

如果您觉得由于某种原因无法披露您的真实代码,那么除了创建a minimal, complete and verifiable example之外没有别的办法。这是对所有想要帮助的人的态度和尊重。

您显示的代码将不会运行,此外,您还应该告诉我们哪里来的$method$methodID以及您如何计算它们。

其次,回到你的问题,我注意到的东西是相当不寻常和可能最终是一个问题。我不确定,因为你没有显示你的表格定义。

对于以下,使想清楚我说了,让我们假设你的表table实际上有名字persons,然后让我们来看看你的表personsreports

通常,在每个表格中,您都有一个主键,通常称为ID。在两个表之间有关系时,为了使数据库能够在两个表中的行之间建立“连接”,必须将另一个表中的一个表的ID值存储在单独的列中。

在你的榜样,这将意味着,该表persons有一栏ID和表reports有一栏ID,但表reports另外有一栏PersonID,而该人的ID行涉及到存储。

但根据你的榜样,要加入这样的:

... 
join reports on (persons.ID = reports.ID) 
... 

如果您使用的是常用的方法,并在每个表(包括reports表)列ID实际上只是行ID(主键),这没有任何意义。相反,你必须参加这样的:

... 
join reports on (persons.ID = reports.PersonID) 
... 

第三(?或会为母语的人说,“第三”在这里),如果你想拉刚刚过去的记录,你可以使用与总分组功能。要做到这一点,做出以下更改SQL语句:

SELECT ..., 
     MAX(reports.dTime), 
     ... 
FROM ... 
WHERE ... 
GROUP BY persons.ID, 
     reports.cID 

这将选择所有不同对的PersonIDcID,并显示每对上一次报告的日期/时间。

如果你想显示每PersonID(而不是每个PersonID/cID对)上一次报告的日期/时间,你可以离开远离上述代码的最后一行。但请注意,如果您仍然从contacts表中选择SELECT列,数据库将从contacts表中的匹配行中选择随机行。

+0

谢谢你的回应。我将运行一些样本并测试并与您取得联系。 –