PHP / SQL: как объединить / объединить значения столбцов в одну строку

#php #mysql #sql #database #concatenation

#php #mysql #sql #База данных #конкатенация

Вопрос:

У меня есть этот php-скрипт под названием title, где предполагается перечислять детали фильмов этих фильмов с заголовком, соответствующим введенной подстроке. Ожидаемый результат должен быть таким, как на ссылке / картинке ниже. У меня проблемы с объединением жанров каждого фильма, поскольку в одном фильме может быть много жанров. Я пытался использовать 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("$usagen");

// 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  ;
}

?>
  

Ожидаемый результат должен быть в этом формате

Ответ №1:

Измените свой запрос следующим образом,

 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. Я забыл упомянуть, что я использую PostgreSQL, есть ли эквивалентная функция GROUP_CONCAT для PostgreSQL или другой способ добиться этого?

Ответ №2:

Для достижения этого вы можете использовать функцию group_concat в вашем скрипте mysql. Это объединит ваш соответствующий столбец через запятую (,).

Комментарии:

1. Спасибо, но я не могу использовать group_concat(), так как я использую postgre, но я нашел ответ, используя string_agg()