PHP / SQL:如何将列值串联/合并成一行

时间:2019-04-10 11:42:32

标签: php mysql sql database concatenation

我有一个名为title的php脚本,应该在其中列出标题与输入的子字符串匹配的那些电影的电影详细信息。预期的输出应该类似于下面的链接/图片。由于一部电影可以具有多种流派,因此我在合并每部电影的流派时遇到了麻烦。我尝试使用concat(),array_to_string(),但仍然失败。

  

mkSQL()通过获取查询模板来构造“安全” SQL查询字符串   字符串,并使用值填充模板中类似于printf的插槽   在后续参数中提供。该函数取一个可变数字   论点第一个始终是查询模板字符串,   以下参数完全对应于   模板。例如

  $id = 3012345;  
  $q1 = mkSQL("select * from R where id = %d",$id);
     

将创建查询字符串:

  $q1: "select * from R where id = 12345"

下面是代码,非常感谢您的帮助和提示!

  

这是流派表架构

CREATE TABLE Genre (
movie_id integer REFERENCES Movie(id),
genre GenreType,
primary key (movie_id,genre));
#!/usr/bin/php
<?php

// include the common PHP code file
require("a2.php");

$db = pg_connect("dbname=mydb");

// Check arguments
if (count($argv) < 2) exit("$usage\n");

// Get the return results
$val = $argv[1];
$q = "select m.title, m.year, m.content_rating, r.imdb_score, array_to_string(array(select g.genre FROM Genre g where g.movie_id = m.id),',')
     -- concat(select g.genre FROM Genre g where g.movie_id = m.id
      from Movie m JOIN Rating r ON r.movie_id = m.id
      where m.title ilike %p
      order by m.year, r.imdb_score desc, m.title asc";
$r = pg_query($db, mkSQL($q, $val));

// Iterate through the results and print
$i = 1;
while ($t = pg_fetch_array($r)) {
  echo "$i. $t[0] ($t[1], $t[2], $t[3]) [$t[4]]\n";
  $i++;
}

?>

The expected output is supposed to be in this format

2 个答案:

答案 0 :(得分:0)

将您的查询更改为

SELECT CONCAT(m.title, ' (', m.year, ', ', m.content_rating, ',', r.imdb_score, ') [', (SELECT array_to_string(array_agg(g.genre), ',') FROM Genre g WHERE g.movie_id = m.id), ']') movie_title
FROM Movie m JOIN Rating r ON r.movie_id = m.id
WHERE m.title ilike %p
ORDER BY m.year, r.imdb_score desc, m.title ASC

在这里,我将所有列合并为一个,并为其赋予了别名movie_title。您将按照指定的格式获得电影名称。

答案 1 :(得分:0)

为实现此目的,可以在mysql脚本中使用group_concat函数。 这将通过comma(,)连接您各自的列。