带有两个表的 PHP 查询

Posted

技术标签:

【中文标题】带有两个表的 PHP 查询【英文标题】:PHP query with two table 【发布时间】:2016-11-03 08:07:16 【问题描述】:

参考this 话题。 我的问题是我使用 php 5 列插入到一个表中,但其中一个是另一个表的外键。所以,我会看到值而不是链接目录。 例如,Orders.Name 包含值“1”、“2”、“3”、“4”等...它们包含在表 “Clients” 的列中ID “1” “姓名”“Jack”,ID“2”是“姓名”是“Mark”,ID“3”,“Name”是“Frank”……等等。所以,我会看到“Jack”,而不是“1”。

示例: 数据库名称:DinamicoWeb 表名:订单 字段名称:Id Ord、Ord Date、名称、价格、总计 第二个表名称:Clients 字段名称:Id Client、Name、Cell、City、Address

我的实际结果:

Id Ord   Ord Date    Name    Price    Totale
   1      14/2/99     1       189       345

Id Client   Name       Cell        City       Street
    1       Jack      23445456    Italy      Road nr 2

我的愿望结果:

Id Ord   Ord Date    Name    Price    Totale
   1      14/2/99    Jack     189       345

所以,这是我的代码。config.php

<?php
define ('DBNAME',"./DinamicoWeb.mdb"); // Database name
define ('DBTBL',"Orders"); // Table name 1
define ('PKNAME',"Id Ord"); // Primary Key
define ('PKCOL',0); // Position Primary Key
define ('LINKPK',true); // PK link for edit/delete
?>

test.php

<?php
require_once("config.php");

$cn = new COM("ADODB.Connection");
$cnStr = "DRIVER=Microsoft Access Driver (*.mdb); DBQ=".
            realpath(DBNAME).";";
$cn->open($cnStr);
$rs = $cn->execute("SELECT [Id Ord] AS [ID], [Ord Date] AS [Date], [Name] AS [Name], [Price] AS [Price], [Total] AS [TOTAL] FROM [Orders]");
$numFields = $rs->Fields->count;

// Print html
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
echo '<html xmlns="http://www.w3.org/1999/xhtml">';
echo '<head>';
echo '<meta http-equiv="Content-Type" 
     content="text/html; charset=utf-8" />';
echo '<title>Gestione degli '.DBTBL.'</title>';
echo '<link href="styles.css" rel="stylesheet" type="text/css" />';
echo '<link rel="stylesheet" href="css/bootstrap.css">';
echo '<link rel="stylesheet" href="css/footable.bootstrap.css">';
echo '<link rel="stylesheet" href="css/footable.bootstrap.min.css">';
echo '<link rel="stylesheet" href="css/footable.core.bootstrap.min.css">';
echo '</head><body>';
echo '<h1>GESTIONE '.DBTBL.'</h1>';
// Elenca records -----
//echo ("<div class='table-responsive'>");
echo ("<table class='datatable table tabella_reponsive ui-responsive' summary='Prova dati con MS Access'>");
echo("<caption>Tabella ".DBTBL."</caption>\n");
echo("<thead><tr>\n");
for ($i=0;$i<$numFields;$i++)
    echo("<th scope='col'>");
    echo $rs->Fields($i)->name;
    echo("</th>\n");

echo("</tr></thead>\n");
echo("<tbody>");

$alt = false;
while (!$rs->EOF)

    echo("<tr>");
    for ($i=0;$i<$numFields;$i++)
      $altClass = $alt ? " class='alt'" : "";
      if (LINKPK && $i==PKCOL)
        echo "<td".$altClass."><a href='?id=".$rs->Fields($i)->value
              ."'>".$rs->Fields($i)->value."</a></td>\n";
      
      else
        echo "<td".$altClass.">".$rs->Fields($i)->value."</td>\n";
      
    
    echo("</tr>\n");    
    $rs->MoveNext();
    $alt = !$alt;

echo("</tbody>");
echo("</table>\n");
echo("</div>");
echo '<script src="js/footable.js"></script>';
echo '<script src="js/footable.min.js"></script>';

echo '</body></html>';
$rs->Close();
$cn->Close();
?>

谢谢!

更新: 我在 Client 和 Order 表之间有关系。

这是我对 Access 的查询。 (不同的名字和不同的要求)

SELECT DISTINCT Ordini.[Id Ord], Ordini.[Tipo Ord] AS Tipo, Ordini.[N Ord] AS Numero, Ordini.[Data Ord] AS Data, Ordini.Anno, Anagrafica.CodAnag AS Codice, Ordini.[Ragione sociale], IIf([stato]=0,"inserito",IIf([stato]=1,"stampato","Bloccato")) AS [Stato ord], Ordini.[Data consegna] AS Consegna, Ordini.ValidoFinoAl AS Validità, [tabella pagamenti].Descrizione AS Pagamento, Ordini.Rif1 AS [Ns Riferimenti], Ordini.Rif2 AS [Vs Riferimenti], IIf(Not IsNull([idsped]),[anagrafica spedizioni].[Ragione Sociale] & " " & [anagrafica spedizioni].Indirizzo & " " & [anagrafica spedizioni].Località,IIf(Not IsNull(anagrafica_1.[id anag]),anagrafica_1.[Ragione Sociale] & " " & anagrafica_1.Indirizzo & " " & anagrafica_1.Località)) AS Destinazione, Ordini.TotImp, Ordini.TotNI, Ordini.Cambio, Temp_Ordini_Interroga.ApertoEuro, Temp_Ordini_Interroga.TotaleEuro, Ordini.Sospeso
FROM ((((Ordini INNER JOIN Anagrafica ON Ordini.[Id anag] = Anagrafica.[Id anag]) INNER JOIN [tabella pagamenti] ON Ordini.[Id pagamento] = [tabella pagamenti].[Id pagamento]) LEFT JOIN [anagrafica spedizioni] ON (Ordini.DestSped = [anagrafica spedizioni].CodSped) AND (Ordini.Dest = [anagrafica spedizioni].[Id anag])) LEFT JOIN Anagrafica AS Anagrafica_1 ON Ordini.Dest = Anagrafica_1.[Id anag]) INNER JOIN Temp_Ordini_Interroga ON Ordini.[Id Ord] = Temp_Ordini_Interroga.IdOrd
ORDER BY Ordini.Anno DESC , Ordini.[Data Ord] DESC , Ordini.[N Ord] DESC;

【问题讨论】:

客户和订单表之间存在某种关系 您可以在查询中使用 JOIN,关系将是 Orders.[Name] = Clients.[Id Ord] @jaidutt 是的,我有。 @bagiak 你可以查看我的答案 正确的sintax是Orders.[Name] 【参考方案1】:

我不知道我是否理解您的问题,但我认为您应该尝试更改您的查询,例如:

SELECT [Id Ord] AS [ID], [Ord Date] AS [Date], [Clients.name] AS [Name], [Price] AS [Price], [Total] AS [TOTAL] FROM [Orders] LEFT JOIN [Clients] ON [Clients.id]=[Orders.name]

【讨论】:

我尝试了这个解决方案,但不起作用。留言:Fatal error: Uncaught exception 'com_exception' with message '&lt;b&gt;Source:&lt;/b&gt; Microsoft OLE DB Provider for ODBC Drivers&lt;br/&gt;&lt;b&gt;Description:&lt;/b&gt; [Microsoft][Driver ODBC Microsoft Access] Parentesi non valide nel nome '[Clients.Id]'. 可能是这样的:codeClients.[Id Client] = Orders.[name]code 可能是这样的:Clients.[Id Client] = Orders.[name] 并在选中字段Clients.[name] AS [name] 我更改了代码,现在编辑器和最终页面上没有错误。但它不起作用,我不知道原因。【参考方案2】:

你必须在你的 sql 请求中使用 join。

例子:

Select orders.idOrd, orders.ordDate, client.name, orders.price, orders.totale 
From orders
join client on client.idClient = orders.Name 

你也可以为表格使用别名:

Select o.idOrd, o.ordDate, c.name, o.price, o. totale
From orders o
join client c on c.idClient = o.Name

这个请求会在c.name列的client表中选择对应的名字。

您应该将订单表中的“名称”列重命名为“ClientId”以 连贯。

【讨论】:

如果我写“Orders.Id ord”(带空格),这不起作用。如何重命名 PHP(而不是 DB Access)上的所有列?【参考方案3】:

不要与 sql 中的 as 重复相同的名称。为列分配名称时也不要保留空格。使用下划线 (_) 分隔单词。

SELECT [Id Ord] AS [ID], [Ord Date] AS [Date], [Name] , [Price], [Total] 
FROM [Orders],[Clients]
WHERE [Orders.Name]=[Clients.Id];

【讨论】:

我尝试了这个解决方案,但不起作用。留言:Fatal error: Uncaught exception 'com_exception' with message '&lt;b&gt;Source:&lt;/b&gt; Microsoft OLE DB Provider for ODBC Drivers&lt;br/&gt;&lt;b&gt;Description:&lt;/b&gt; [Microsoft][Driver ODBC Microsoft Access] Parentesi non valide nel nome '[Clients.Id]'. 你不能使用这种方式'[Clients.Id]'。将此用作Clients.Id 我已经尝试过了。留言:Fatal error: Uncaught exception 'com_exception' with message '&lt;b&gt;Source:&lt;/b&gt; Microsoft OLE DB Provider for ODBC Drivers&lt;br/&gt;&lt;b&gt;Description:&lt;/b&gt; [Microsoft][Driver ODBC Microsoft Access] Syntax error (missing operator) in query 'Clients.Id=Orders.Name' 什么是'Clients.Id=Orders.Id'? 我复制错误时犯了一个错误,现在我编辑了最后一条评论,对不起。我不能使用Clients.'Id Client';【参考方案4】:

试试这个

SELECT 
    [Orders.Id Ord] AS [ID], [Orders.Ord Date] AS [Date], 
    [Clients.Name] AS [Name], [Orders.Price] AS [Price], 
    [Orders.Total] AS [TOTAL] 
FROM 
    [Orders] 
JOIN
    Clients ON Orders.name = clients.client id;

注意:删除列名中的空格。

【讨论】:

我尝试了这个解决方案,但不起作用。留言:Fatal error: Uncaught exception 'com_exception' with message '&lt;b&gt;Source:&lt;/b&gt; Microsoft OLE DB Provider for ODBC Drivers&lt;br/&gt;&lt;b&gt;Description:&lt;/b&gt; [Microsoft][Driver ODBC Microsoft Access] Parentesi non valide nel nome '[Clients.Id]'. 不工作。正确的 sintax 是 Orders.[Name] 就像建议 @th3fr33man 一样,但是如果我更改两个代码都不起作用。

以上是关于带有两个表的 PHP 查询的主要内容,如果未能解决你的问题,请参考以下文章

带有 INNER JOIN 的两个表的 SQL INSERT 语句

SQL 在视图中使用交叉引用两个表的结果创建列

MySQL JOIN 2 个表并分别获取两个表的总和

将来自两个选择查询的数据添加到一个表中,这些查询针对来自两个不同表的不同列数

php+mysql多条件多值查询

SQL 在表的两个副本之间留下了带有 WHERE 子句依赖关系的自连接