Php 正确连接3个表

Php 正确连接3个表,php,mysql,Php,Mysql,试图通过我自己而不是我来修复现有代码中的错误。此代码中的错误是,除非第二个表中有相应的id项,否则它根本不会显示在输出中。在第一个表邮件中,我有多个条目,它们会被过滤掉,因为输出中确实显示了正确的邮件总数。。。除非邮件中有第二个表中的项目,否则不会输出它。 我尝试了另一个使用diff连接的查询 SELECT id, messageType, sender, mail.receiver, subject, body, has_i

试图通过我自己而不是我来修复现有代码中的错误。此代码中的错误是,除非第二个表中有相应的id项,否则它根本不会显示在输出中。在第一个表邮件中,我有多个条目,它们会被过滤掉,因为输出中确实显示了正确的邮件总数。。。除非邮件中有第二个表中的项目,否则不会输出它。 我尝试了另一个使用diff连接的查询

SELECT 
    id, 
    messageType, 
    sender, 
    mail.receiver, 
    subject, 
    body, 
    has_items, 
    money, 
    cod, 
    checked 
FROM 
    mail 
        LEFT OUTER JOIN mail_items 
            ON id = mail_id 
        LEFT JOIN item_instance 
            ON item_guid = guid
问题是。。。我得到一个错误: 您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解在“LIMIT 1”附近使用的正确语法

如何使mail table和mail_items表在正确地从第三个表获取项目guid的同时连接,并输出邮件表条目,即使mail_items表中没有该邮件的项目

//==========================$_GET and SECURE=================================
$start = (isset($_GET['start'])) ? $sqlc->quote_smart($_GET['start']) : 0;
if (is_numeric($start)); 
else 
    $start = 0;

$order_by = (isset($_GET['order_by'])) ? $sqlc->quote_smart($_GET['order_by']) : 'id';
if (preg_match('/^[_[:lower:]]{1,12}$/', $order_by)); 
else 
    $order_by = 'id';

$dir = (isset($_GET['dir'])) ? $sqlc->quote_smart($_GET['dir']) : 1;
if (preg_match('/^[01]{1}$/', $dir)); 
else 
    $dir = 1;

$order_dir = ($dir) ? 'ASC' : 'DESC';
$dir = ($dir) ? 0 : 1;
//==========================$_GET and SECURE end=============================

$query = $sql->query("SELECT a.id, a.messageType, a.sender, a.receiver, a.subject, a.body, a.has_items, a.money, a.cod, a.checked, b.item_guid, c.itemEntry
                      FROM mail a INNER JOIN mail_items b ON a.id = b.mail_id LEFT JOIN item_instance c ON b.item_guid = c.guid ORDER BY $order_by $order_dir LIMIT $start, $itemperpage");
$total_found = $sql->num_rows($query);
$this_page = $sql->num_rows($query);
$query_1 = $sql->query("SELECT count(*) FROM `mail`");
$all_record = $sql->result($query_1,0);

试着这样做:

SELECT 
/*
    The columns that you want to select
*/
FROM 
    mail a
LEFT OUTER JOIN mail_items b ON a.id = b.mail_id 
LEFT JOIN item_instance c ON b.item_guid = c.guid
注意,当您尝试选择列时,请确保将正确的表别名附加到列名。这里的表mail、mail\u items和item\u instance分别有a、b、c作为别名

如果使用上述查询为表保留相同的别名,则需要对代码执行以下修改:

$order_by = (isset($_GET['order_by'])) ? $sqlc->quote_smart($_GET['order_by']) : 'id';
if (preg_match('/^[_[:lower:]]{1,12}$/', $order_by)); 
else 
    $order_by = 'a.id';

试着这样做:

SELECT 
/*
    The columns that you want to select
*/
FROM 
    mail a
LEFT OUTER JOIN mail_items b ON a.id = b.mail_id 
LEFT JOIN item_instance c ON b.item_guid = c.guid
注意,当您尝试选择列时,请确保将正确的表别名附加到列名。这里的表mail、mail\u items和item\u instance分别有a、b、c作为别名

如果使用上述查询为表保留相同的别名,则需要对代码执行以下修改:

$order_by = (isset($_GET['order_by'])) ? $sqlc->quote_smart($_GET['order_by']) : 'id';
if (preg_match('/^[_[:lower:]]{1,12}$/', $order_by)); 
else 
    $order_by = 'a.id';

我不是SQL专家,但我认为

FROM mail a INNER JOIN mail_items b 
别名分配需要AS关键字:

FROM mail AS a INNER JOIN mail_items AS b 

我不是SQL专家,但我认为

FROM mail a INNER JOIN mail_items b 
别名分配需要AS关键字:

FROM mail AS a INNER JOIN mail_items AS b 
试试这种, 从表1中选择*作为T1将表2作为T2连接到T.id=T2.id将表3作为T3连接到T.id=T3.id,

从表1中选择*作为T1将表2作为T2在T.id=T2.id将表3作为T3在T2.id=T3.id

可以发布表的架构吗?显示的查询中没有限制1。因此,您向我们显示了错误的查询,或者错误的错误。该查询也是错误的。我认为您试图匆忙地将实际查询从$query=$sql->query复制到modify粘贴到big-to-post。。。啊。我有一种感觉,在这里问这个太牵强了。。不管怎样,谢谢。当我回显查询时,我只是说resource 25,您可以发布表的架构吗?您显示的查询在任何地方都没有限制1。因此,您向我们显示了错误的查询,或者错误的错误。该查询也是错误的。我认为您试图匆忙地将实际查询从$query=$sql->query复制到modify粘贴到big-to-post。。。啊。我有一种感觉,在这里问这个太牵强了。。不管怎样,谢谢。当我回显查询时,只是说resource 25给了我一个错误:您的SQL语法有一个错误;检查与您的MySQL服务器版本对应的手册,在第1行的“LIMIT 1”附近使用正确的语法。您可以发布您正在执行的查询吗?限制1从何而来?从上面的$start变量猜测。。虽然它说0@ChristopherSebastiano:你能试一下这两件事中的任何一件吗。从$sql->查询中删除按$ORDER\u按$ORDER\u目录下的订单。。。或2。将上面的else语句修改为$order_by='a.id';正如我所说的,您需要为查询提供正确的表别名才能工作。。我在这里的某个地方附上了截图。。网站新手给了我一个错误:你的SQL语法有一个错误;检查与您的MySQL服务器版本对应的手册,在第1行的“LIMIT 1”附近使用正确的语法。您可以发布您正在执行的查询吗?限制1从何而来?从上面的$start变量猜测。。虽然它说0@ChristopherSebastiano:你能试一下这两件事中的任何一件吗。从$sql->查询中删除按$ORDER\u按$ORDER\u目录下的订单。。。或2。将上面的else语句修改为$order_by='a.id';正如我所说的,您需要为查询提供正确的表别名才能工作。。我在这里的某个地方附上了截图。。当您为表提供别名时,siteAFAIK AS的新增功能是可选的。此处的屏幕截图可能有助于了解表。此解决方案仅显示包含项的条目。。需要它来显示没有和有项目的邮件但是这是一个SQL语法错误,它与不正确的连接无关-这只会返回不正确的数据集。关注查询本身,而不是schema.AFAIK,因为在为表提供别名时,schema.AFAIK是可选的。此处的屏幕截图可能有助于了解表。此解决方案仅显示包含项的条目。。需要它来显示没有和有项目的邮件但是这是一个SQL语法错误,它与不正确的连接无关-这只会返回不正确的数据集。关注查询本身而不是模式。OP的问题是当表T2
在您的情况下,没有与表T1中的id对应的任何数据。您指定的连接无法解决他面临的问题。第一个答案是正确的查询,如图所示,但在php中它会引发语法错误:/OP的问题是,当您的示例中的表T2没有与表T1中的id对应的任何数据时,如何显示数据。您指定的连接无法解决他面临的问题。第一个答案是正确的查询,如图所示,但在php中会抛出语法错误:/