Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 理解如何正确连接mySQL表有困难_Php_Mysql_Join - Fatal编程技术网

Php 理解如何正确连接mySQL表有困难

Php 理解如何正确连接mySQL表有困难,php,mysql,join,Php,Mysql,Join,好的,这是我的问题。 我正在向现有数据库添加一个表以存储项目注释 “worklog”是包含项目的表 “worklognotes”是包含项目注释的表格 笔记将显示为一条讨论线索。 worklognotes列的设置如下:id、worklog_id、时间戳、notes “id”是表的唯一id。 “worklog_id”是注释所表示的存储在另一个表中的项目的id。 “时间戳”是一个时间戳 “注释”是关于项目的实际持续注释。单个项目可能有许多注释 查看下面的数据库查询。我加入了两个查询:“这是我第一次加入

好的,这是我的问题。 我正在向现有数据库添加一个表以存储项目注释

“worklog”是包含项目的表 “worklognotes”是包含项目注释的表格

笔记将显示为一条讨论线索。 worklognotes列的设置如下:id、worklog_id、时间戳、notes

“id”是表的唯一id。 “worklog_id”是注释所表示的存储在另一个表中的项目的id。 “时间戳”是一个时间戳 “注释”是关于项目的实际持续注释。单个项目可能有许多注释

查看下面的数据库查询。我加入了两个查询:“这是我第一次加入,所以我不确定我是否做对了。” 它读取并显示两个表中的信息。 但是下面的代码显示了“worklog”中的每个条目,这些条目在“worklognotes”表中有一条记录。 我需要它显示“worklog”中的一个条目和“worklognotes”中的多个注释

你能帮忙或建议一个方向吗

$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
这将为您提供每个工作项仅一行的内容,以及包含和分隔的所有注释

取决于你的列名哟