Рассматривая 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

И я получил результат ниже:

resultado da query

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

Есть ли способ, чтобы упорядочить результат таким образом, что облегчает мой цикл в view или чтобы это организовать лучше, мне нужно работать, сам шнурок?

Author: rray, 2016-06-23

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
 1
Author: Euler01, 2016-06-23 13:12:21

И Вы должны сгруппировать его.

Сделать что-то вроде:

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
 0
Author: Reginaldo Rigo, 2016-06-23 12:09:46