将行作为数组从每个行的另一个表中连接起来

时间:2010-11-20 10:30:22

标签: php mysql join

我正在使用codeigniter为自己编写一个电影归档脚本。我从IMDb获取电影的信息并将它们添加到我的数据库中。我正在使用另一个名为链接的表格为我选择的电影添加链接。

这是我用来从数据库中获取电影的查询:

    $movies = $this->db->query("SELECT *
  FROM movies
  ORDER BY ".$order['by']." ".$order['type']."
  LIMIT ".$limit.", " . $this->config->item('moviePerPage')
  );

我在这样的视图文件中获取它:

foreach ($movies->result() as $row) {
  echo $row->name;
}

现在必须为每部具有匹配ID的电影显示链接(电影可以有多个链接)。我的链接表包含以下列:' id',' movieid',' name',' link'

如何通过单个MySQL查询获取每部电影的链接?是否可以获取与当前$ row影片相关的所有链接并将它们作为数组绑定到单个变量?有了这个,我可以用foreach()循环它,并显示每部电影的链接。

btw:movies.movi​​eid和links.movi​​eid列具有相同的数据。

2 个答案:

答案 0 :(得分:3)

我认为你需要mysql' GROUP_CONCAT

做这样的事情: -

SELECT 
    movies.*, 
    group_concat(links.link ', ') as links
FROM movies 
LEFT JOIN links 
ON links.movieid = movies.movieid 
GROUP BY movies.movieid

您将获得以逗号分隔的每部电影的链接列表。 您可以这样提取: -

foreach ($movies->result() as $row) {
  $linksArray = explode(",",$row->links);
}

<强>更新  我认为这是获得结果的唯一方法,而不会为具有多个链接的单个影片提供多个结果行。

请注意结果中可以获得的最大字符长度 - 默认为1024个字符。读这个 Mysql group_concat_max_lengthGroup concat max length知道如何覆盖限制。

和Dan Grossman一样,如果你觉得链接可能包含逗号,请使用不同或不常见的分隔符。

答案 1 :(得分:0)

加入两个表,就像你的问题名称所暗示的一样。

SELECT 
    movies.*, 
    links.* 
FROM movies 
LEFT OUTER JOIN links 
ON links.movieid = movies.movieid 
...

每个电影链接对将获得一行。如果没有电影的链接,您将获得一行只包含电影信息和与链接表对应的列中的NULL。

如果您愿意,可以循环显示这些结果,并将每部电影的链接放入由电影键入的数组中。