Php 3个表,左连接,以防一个表中缺少数据

Php 3个表,左连接,以防一个表中缺少数据,php,mysql,left-join,Php,Mysql,Left Join,表1(ID始终存在) 表2(ID始终存在) 表3(ID可能缺失,在这种情况下,2缺失) PHP 这只有在所有三个表都包含“相同id”时才有效,但是如果表3中由于任何原因缺少“id”,会发生什么情况?当$col=ab时,我如何仍然测试所有三个表并将t1.id获取到输出1?我必须使用左连接吗 $a = mysql_query("SELECT t1.id FROM table1 AS t1, table2 AS t2 LEFT JOIN (SELECT id FROM table3 WHERE co

表1(ID始终存在)

表2(ID始终存在)

表3(ID可能缺失,在这种情况下,2缺失)

PHP

这只有在所有三个表都包含“相同id”时才有效,但是如果表3中由于任何原因缺少“id”,会发生什么情况?当$col=ab时,我如何仍然测试所有三个表并将t1.id获取到输出1?我必须使用左连接吗

$a = mysql_query("SELECT t1.id FROM table1 AS t1, table2 AS t2 
LEFT JOIN (SELECT id FROM table3 WHERE col3 = '$col') AS t3 ON t3.id = t1.id 
WHERE t1.id = t2.id AND (t1.col1 = '$col' OR t2.col2 = '$col')
GROUP BY t1.id, t2.id");

我做错了什么?

你做错了什么?查询不存在的表。这总是会引起一个错误

我不打算讨论设计一个数据库的智慧,在这个数据库中,对查询至关重要的表来来往往

你对客户的唯一希望就是

  • 测试表是否存在 你感兴趣,而且
  • 执行不同的SQL语句 基于这些结果

[编辑后]

听起来您需要一个或两个左外联接。这将为您提供表1和表2共有的所有ID,而不管它们是否在表3中

select t1.id, t2.id, t3.id
from table1 t1
inner join table2 t2 on (t1.id = t2.id)
left join table3 t3 on (t1.id = t3.id);
这将为您提供表1中的所有ID,不管它们是在表2还是表3中

select t1.id, t2.id, t3.id
from table1 t1
left join table2 t2 on (t1.id = t2.id)
left join table3 t3 on (t1.id = t3.id);

当然,您可以使用WHERE子句过滤结果。

您做错了什么?查询不存在的表。这总是会引起一个错误

我不打算讨论设计一个数据库的智慧,在这个数据库中,对查询至关重要的表来来往往

你对客户的唯一希望就是

  • 测试表是否存在 你感兴趣,而且
  • 执行不同的SQL语句 基于这些结果

[编辑后]

听起来您需要一个或两个左外联接。这将为您提供表1和表2共有的所有ID,而不管它们是否在表3中

select t1.id, t2.id, t3.id
from table1 t1
inner join table2 t2 on (t1.id = t2.id)
left join table3 t3 on (t1.id = t3.id);
这将为您提供表1中的所有ID,不管它们是在表2还是表3中

select t1.id, t2.id, t3.id
from table1 t1
left join table2 t2 on (t1.id = t2.id)
left join table3 t3 on (t1.id = t3.id);

当然,您可以使用WHERE子句过滤结果。

只有当表确实存在但不包含数据时,左联接才起作用

如果您不想做类似的事情(检查表是否存在,并在此基础上使用不同的SQL语句…),那么您必须确保表存在于数据库中,即使它是完全空的

在正常情况下,您应该对应用程序的数据库有一定程度的控制,因此您应该能够确保表确实存在


如果这真的是一个大问题(例如,您无法确定是否有人删除了该表),您可以在每次启动应用程序时检查这一点:如果表不存在,则创建该表。

左联接仅在表确实存在但不包含数据时有效

如果您不想做类似的事情(检查表是否存在,并在此基础上使用不同的SQL语句…),那么您必须确保表存在于数据库中,即使它是完全空的

在正常情况下,您应该对应用程序的数据库有一定程度的控制,因此您应该能够确保表确实存在


如果这真的是一个大问题(比如,你不能确定是否有人删除了表),你可以在每次启动应用程序时检查这个问题:如果表不存在,就创建它。

好的,我知道这会引起混乱,这就是我更新帖子的原因。该表将始终存在,但不包含某些“ID”;)好吧,我知道这会引起混乱,这就是我更新帖子的原因。该表将始终存在,但不包含某些“ID”;)没有背景,你很难理解你想要实现什么。您要检索哪些数据,以及表之间的相关性是什么?如果没有上下文,就很难理解您想要实现什么。您希望检索哪些数据,表之间的相关性是什么?
select t1.id, t2.id, t3.id
from table1 t1
inner join table2 t2 on (t1.id = t2.id)
left join table3 t3 on (t1.id = t3.id);
select t1.id, t2.id, t3.id
from table1 t1
left join table2 t2 on (t1.id = t2.id)
left join table3 t3 on (t1.id = t3.id);