Объединение строк в виде массива из другой таблицы для каждой строки - PullRequest
2 голосов
/ 20 ноября 2010

Я кодирую сценарий архива фильмов, используя для себя codeigniter с PHP. Я получаю информацию о фильме из 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', 'movieid', 'name', 'link'

Как я могу получить ссылки для каждого фильма одним запросом MySQL? Можно ли получить все ссылки, связанные с текущим фильмом $ row, и связать их с одной переменной в виде массива? с этим я могу зациклить его с foreach () и показать ссылки для каждого фильма.

Кстати, столбцы movies.movieid и links.movieid содержат одинаковые данные.

Ответы [ 2 ]

3 голосов
/ 20 ноября 2010

Я думаю, вам нужно mysql's 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_length и Максимальная длина группы конкатов , чтобы узнать, как переопределить ограничение.

И, как Дэн Гроссман указал, если вы считаете, что ссылки могут содержатьзапятая, используйте другой или необычный разделитель.

0 голосов
/ 20 ноября 2010

ПРИСОЕДИНИТЕСЬ к двум таблицам, как следует из названия вашего вопроса.

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

Вы получите одну строку на каждую пару ссылок на фильмы.Если для фильма нет ссылок, вы получите строку с информацией о фильме и пустыми значениями в столбцах, соответствующих таблице ссылок.

Вы можете зацикливаться на этих результатах и ​​помещать ссылки для каждого фильма в массив с ключом, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...