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

У меня есть этот php-скрипт с именем title, где он должен перечислять сведения о фильмах этих фильмов с заголовком, соответствующим введенной подстроке. Ожидаемый результат должен быть таким, как показано на ссылке/картинке ниже. У меня проблемы с объединением жанров каждого фильма, так как в одном фильме может быть много жанров. Я пытался использовать concat(), array_to_string(), но все равно не получается.

mkSQL() constructs "safe" SQL query strings by taking a query template string and filling in printf-like slots in the template with values supplied in subsequent arguments. The function takes a variable number of arguments; the first is always a query template string, with the following arguments corresponding exactly to the slots in the template. E.g.

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

would create the query strings:

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

Ниже приведены коды, любая помощь и советы будут очень признательны, спасибо!

This is the Genre Table Schema

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

?>

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
1 191
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Измените свой запрос, например,

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. Вы получите название фильма в соответствии с указанным форматом.

Я забыл упомянуть, что использую PostgreSQL, есть ли эквивалентная функция GROUP_CONCAT для PostgreSQL или другой способ сделать это?

user11178088 10.04.2019 14:18

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

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

user11178088 11.04.2019 05:45

Другие вопросы по теме