带有两个表的 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 '<b>Source:</b> Microsoft OLE DB Provider for ODBC Drivers<br/><b>Description:</b> [Microsoft][Driver ODBC Microsoft Access] Parentesi non valide nel nome '[Clients.Id]'.
可能是这样的:code
Clients.[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 '<b>Source:</b> Microsoft OLE DB Provider for ODBC Drivers<br/><b>Description:</b> [Microsoft][Driver ODBC Microsoft Access] Parentesi non valide nel nome '[Clients.Id]'.
你不能使用这种方式'[Clients.Id]'。将此用作Clients.Id
我已经尝试过了。留言:Fatal error: Uncaught exception 'com_exception' with message '<b>Source:</b> Microsoft OLE DB Provider for ODBC Drivers<br/><b>Description:</b> [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 '<b>Source:</b> Microsoft OLE DB Provider for ODBC Drivers<br/><b>Description:</b> [Microsoft][Driver ODBC Microsoft Access] Parentesi non valide nel nome '[Clients.Id]'.
不工作。正确的 sintax 是 Orders.[Name]
就像建议 @th3fr33man 一样,但是如果我更改两个代码都不起作用。以上是关于带有两个表的 PHP 查询的主要内容,如果未能解决你的问题,请参考以下文章
带有 INNER JOIN 的两个表的 SQL INSERT 语句