Рассматривая Query Many-to-Many
Я в сомнений отношения Many-to-Many, и я надеюсь не будет делать-вопрос повторяется, но я не нашел решения для моей сомнений в углу нет.
и получается, что я у меня есть таблица изображений, таблицы задания и таблица отношений, которая делает отношения Many-to-Many между двумя первыми.
Каждое задание может иметь несколько изображений, связанных с ним. Тогда я сделал запрос следующим образом:
select jobs.*, f1.file_name, f2.file_name
from jobs
left JOIN photos_per_job p ON p.job_id = jobs.id
left JOIN fotos f1 on p.photo_id = f1.id
inner join fotos f2 on jobs.foto_capa = f2.id
И я получил результат ниже:
моя проблема сейчас заключается в организации информации на каналы. Если вы notarem работу хорошо что есть три фотографии, повторяется на результат в три раза, но когда я отобразить работу для пользователя, я покажу работу за раз, и каждая работа будет иметь свою серию фотографий.
Есть ли способ, чтобы упорядочить результат таким образом, что облегчает мой цикл в view или чтобы это организовать лучше, мне нужно работать, сам шнурок?
2 answers
Вы можете реализовать эту логику в родном PHP, изменить select, так:
SELECT jobs.*, f1.file_name, f2.file_name AS nome_foto_capa
from jobs
LEFT JOIN photos_per_job p ON p.job_id = jobs.id
LEFT JOIN fotos f1 on p.photo_id = f1.id
INNER JOIN fotos f2 on jobs.foto_capa = f2.id
Используйте этот код PHP, чтобы обработать результат банка:
$trabalhos = array();
/* LAÇO QUE PERCORRE OS RESULTADOS RETORNADO PELO MYSQL (PODE SUBSTIRUIR PELO QUE VOCE UTILIZA)*/
foreach($results as $row){
if(!isset($trabalhos[$row['id']])){
$trabalhos[$row['id']] = array(
'id' => $row['id'],
'titulo' => $row['titulo'],
'foto_capa' => $row['foto_capa'],
'descricao' => $row['descricao'],
'bg_color' => $row['bg_color'],
'font_color' => $row['font_color'],
'time' => $row['time'],
'nome_foto_capa' => $row['nome_foto_capa']
);
}
$trabalhos[$row['id']]['fotos'][] = $row['file_name'];
}
И тогда вы можете группировки имя из фотографий с помощью GRUOUP_CONCAT, таким образом имя фотографии появятся объединения только в поле, разделенных запятая после и ос дать взорваться по запятая. Но в зависимости от количества фотографий не рекомендую использовать этот подход, потому что GROUP_CONCAT имеет предел символов.
SELECT jobs.*, GROUP_CONCAT(f1.file_name) AS fotos, f2.file_name AS nome_foto_capa
from jobs
LEFT JOIN photos_per_job p ON p.job_id = jobs.id
LEFT JOIN fotos f1 on p.photo_id = f1.id
INNER JOIN fotos f2 on jobs.foto_capa = f2.id
GROUP BY jobs.id
И Вы должны сгруппировать его.
Сделать что-то вроде:
select jobs.*, f1.file_name, f2.file_name
from jobs j
left JOIN photos_per_job p ON p.job_id = j.id
left JOIN fotos f1 on p.photo_id = f1.id
inner join fotos f2 on j.foto_capa = f2.id
group by j.id, j.titulo, j.foto_capa, j.descricao, j.bg_color,
j.font_color, j.time, f2.file_name