Я кодирую сценарий архивного архива с использованием 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 () и показать ссылки для каждого фильма.
btw: movies.movieid и links.movieid имеют одинаковые данные.
Я думаю, вам нужен GROUP_CONCAT от mysql
Сделайте что-то вроде этого:
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 и длину группы concat max, чтобы знать, как переопределить предел.
И, как сказал Дэн Гроссман, если вы чувствуете, что ссылки могут содержать запятую, используйте другой или необычный разделитель.
ПРИСОЕДИНИТЕСЬ к двум таблицам, как следует из вашего имени вопроса.
SELECT movies.*, links.* FROM movies LEFT OUTER JOIN links ON links.movieid = movies.movieid ...
Вы получите одну строку за пару ссылок на фильм. Если нет ссылок для фильма, вы получите строку с информацией о фильме и NULL в столбцах, соответствующих таблице ссылок.
Вы можете перебрать эти результаты и поместить ссылки для каждого фильма в массив, подкрепленный фильмом, если хотите.