Php 理解如何正确连接mySQL表有困难
好的,这是我的问题。 我正在向现有数据库添加一个表以存储项目注释 “worklog”是包含项目的表 “worklognotes”是包含项目注释的表格 笔记将显示为一条讨论线索。 worklognotes列的设置如下:id、worklog_id、时间戳、notes “id”是表的唯一id。 “worklog_id”是注释所表示的存储在另一个表中的项目的id。 “时间戳”是一个时间戳 “注释”是关于项目的实际持续注释。单个项目可能有许多注释 查看下面的数据库查询。我加入了两个查询:“这是我第一次加入,所以我不确定我是否做对了。” 它读取并显示两个表中的信息。 但是下面的代码显示了“worklog”中的每个条目,这些条目在“worklognotes”表中有一条记录。 我需要它显示“worklog”中的一个条目和“worklognotes”中的多个注释 你能帮忙或建议一个方向吗Php 理解如何正确连接mySQL表有困难,php,mysql,join,Php,Mysql,Join,好的,这是我的问题。 我正在向现有数据库添加一个表以存储项目注释 “worklog”是包含项目的表 “worklognotes”是包含项目注释的表格 笔记将显示为一条讨论线索。 worklognotes列的设置如下:id、worklog_id、时间戳、notes “id”是表的唯一id。 “worklog_id”是注释所表示的存储在另一个表中的项目的id。 “时间戳”是一个时间戳 “注释”是关于项目的实际持续注释。单个项目可能有许多注释 查看下面的数据库查询。我加入了两个查询:“这是我第一次加入
$connection = mysql_connect ("localhost", "user", "pass") or die ("I cannot connect to the database.");
$db = mysql_select_db ("database", $connection) or die (mysql_error());
$query = "SELECT * FROM worklog ";
$query .= "JOIN worklognotes ON worklog_id = worklognotes.worklog_id ";
$query .= "WHERE worklognotes.worklog_id=worklog.id ORDER BY worklognotes.id DESC";
创建联接的查询看起来是正确的,但where子句是多余的。试试这个:
SELECT *
FROM worklog
JOIN worklognotes ON worklog_id = worklognotes.worklog_id
ORDER BY worklognotes.id DESC
但是,对于您的特定需求(从一个表获取一条记录,从另一个表获取多条记录),似乎不需要加入。我认为最好运行两个单独的查询,否则将在结果集中的每一行中重复第一个表中的所有数据。创建联接的查询看起来是正确的,但where子句是多余的。试试这个:
SELECT *
FROM worklog
JOIN worklognotes ON worklog_id = worklognotes.worklog_id
ORDER BY worklognotes.id DESC
但是,对于您的特定需求(从一个表获取一条记录,从另一个表获取多条记录),似乎不需要加入。我认为最好运行两个单独的查询,否则您将在结果集中的每一行中重复第一个表中的所有数据。您很可能希望:
SELECT *
FROM worklog
LEFT JOIN worklognotes ON worklog_id = worklognotes.worklog_id
WHERE worklog_id = $worklog_id
ORDER BY worklognotes.timestamp DESC;
这将仅拉出id存储在$worklog_id(比如57)中的工作日志,以及首先显示的任何/所有关联的worklog注释
您的查询正在提取所有工作日志和所有工作日志注释,因为您没有确切指定您想要的工作日志,只是它们必须有一个工作日志注释。您很可能想要:
SELECT *
FROM worklog
LEFT JOIN worklognotes ON worklog_id = worklognotes.worklog_id
WHERE worklog_id = $worklog_id
ORDER BY worklognotes.timestamp DESC;
这将仅拉出id存储在$worklog_id(比如57)中的工作日志,以及首先显示的任何/所有关联的worklog注释
您的查询正在提取所有worklog和所有worklognotes,因为您没有确切指定需要哪个worklog,只是它们必须有一个worklognotes
查看下面的数据库查询。我
加入了两个疑问“这是我的
先加入,所以我不确定我做了什么
它正在读报纸
表和表中的信息
展示它。但是下面的代码是
显示“worklog”中的每个条目
这在世界上是有记录的
“worklognotes”表。我需要它
显示“worklog”中的一个条目,然后
“worklognotes”中的许多注释
是的,这就是你加入时的工作方式。您将以单行的形式获取worklog条目和worklognotes条目。这意味着您将多次使用相同的worklog条目,除非它只有一个worklognote。如果希望以某种层次结构显示,则需要在php端对其进行排序
因此,如果您想要所有的工作日志(或者不止一个)他们的笔记您将使用您拥有的查询,然后对结果进行迭代以进行适当的组织,例如假设$result
是您的mysql\u结果资源,$worklog\u columns
和$worklognote\u columns
以'column\u name'=>格式包含每个表的列名数组空
则可以执行以下操作:
$worklog = array();
while(false !== ($record = mysql_fetch_assoc($result))){
// get only the data for a worklognote
$note = array(array_intersect_key($result, $worklognote_columns));
// get the primary key of the worklog
$id = $record['worklog_id'];
if(!isset($worklog[$id])){
// if we havent already processed this worklog form a previous row
// get the work log data in a separate array
$log = array_intersect_key($result, $worklog_columns);
// add a notes key which will hold an array of worklog_notes
// and assifn the note joined to this row as the first note
$log['notes'] = array($note);
}
else
{
// otherwise jsut append the not joined to this row
// to the existing worklog we processed
$worklog[$id]['notes'][] = $note;
}
}
但是,您必须注意的是,如果要连接的两个表中有同名的列,那么如果使用MYSQL_ASSOC,则只能从连接表中的列中获取值,而不能同时从两个表中获取值。如果您需要访问这两个表上的值,那么您需要使用MYSQL\u NUM或MYSQL\u both或别名查询中的每一列
查看下面的数据库查询。我
加入了两个疑问“这是我的
先加入,所以我不确定我做了什么
它正在读报纸
表和表中的信息
展示它。但是下面的代码是
显示“worklog”中的每个条目
这在世界上是有记录的
“worklognotes”表。我需要它
显示“worklog”中的一个条目,然后
“worklognotes”中的许多注释
是的,这就是你加入时的工作方式。您将以单行的形式获取worklog条目和worklognotes条目。这意味着您将多次使用相同的worklog条目,除非它只有一个worklognote。如果希望以某种层次结构显示,则需要在php端对其进行排序
因此,如果您想要所有的工作日志(或者不止一个)他们的笔记您将使用您拥有的查询,然后对结果进行迭代以进行适当的组织,例如假设$result
是您的mysql\u结果资源,$worklog\u columns
和$worklognote\u columns
以'column\u name'=>格式包含每个表的列名数组空
则可以执行以下操作:
$worklog = array();
while(false !== ($record = mysql_fetch_assoc($result))){
// get only the data for a worklognote
$note = array(array_intersect_key($result, $worklognote_columns));
// get the primary key of the worklog
$id = $record['worklog_id'];
if(!isset($worklog[$id])){
// if we havent already processed this worklog form a previous row
// get the work log data in a separate array
$log = array_intersect_key($result, $worklog_columns);
// add a notes key which will hold an array of worklog_notes
// and assifn the note joined to this row as the first note
$log['notes'] = array($note);
}
else
{
// otherwise jsut append the not joined to this row
// to the existing worklog we processed
$worklog[$id]['notes'][] = $note;
}
}
但是,您必须注意的是,如果要连接的两个表中有同名的列,那么如果使用MYSQL_ASSOC,则只能从连接表中的列中获取值,而不能同时从两个表中获取值。如果您需要访问两个表上的值,那么您需要使用MYSQL\u NUM或MYSQL\u both或别名查询中的每一列。连接就是这样工作的。对于每个有效的组合,您将得到一行。你能得到的最接近你想要的东西就是把所有的工作笔记都记下来
SELECT workitem.workID, GROUP_CONCAT( worknotes.note )
FROM `workitem`
JOIN worknotes ON worknotes.workID = workitem.workID
GROUP BY workID
这将为您提供每个工作项仅一行的内容,以及包含和分隔的所有注释
取决于你的列名哟