PHP, MySQL: нужно показать имя родителя только один раз... почти есть, но все еще проблема

У меня есть родительская категория, которая содержит все имена автомобилей, обозначенные parent_name в таблице «родитель». Для каждого из этих родителей может быть любое количество моделей автомобилей, и все они заносятся в таблицу под названием «модель». Каждая из этих моделей может иметь любое количество изображений и упоминаться через model_id в качестве внешнего ключа. Моя задача - показать все родительское имя только один раз (как в группе) и в то же время перечислить все модели под этим родителем только с 1 соответствующим изображением. Имя parent_name не должно отображаться более одного раза.

МОИ ЭКСПЕРИМЕНТЫ:

Я в основном пытался написать 2 запроса. Один из них заключался в том, чтобы оставить «родительскую» таблицу в «моделях» и использовать GROUP BY parent_id, а затем в цикле while написать еще один запрос для получения только 1 изображения, используя объединение таблиц моделей и изображений с использованием поля model_id. Но при этом отображается только 1 модель, хотя моделей несколько. Поэтому я попытался использовать GROUP BY parent_id, model_id. Использование этого показывает все модели, но в то же время также повторяет отображение parent_name, и мне нужно, чтобы parent_name отображалось только один раз на странице. Вы можете сказать, что я пытаюсь ГРУППИРОВАТЬ имя_модели под родителем и показывать все модели под одним родителем, и я показываю только одно изображение модели. Если каким-то образом я смогу избежать многократного показа parent_name, проблема будет решена.

Схемы моих таблиц приведены ниже:

//Table parent

parent_id   parent_name
    1        Par1
    2       Par2


//Table model

model_id    parent_id   model_name
    1            1       Model1
    2           2       Model2
    3           1       Model3
    4           1       Model4
    5            2       Model5

//Table model_images

image_id    model_id
    1            1
    2           1
    3           1
    4            2
    5           3
    6           3    

ЖЕЛАЕМЫЙ РЕЗУЛЬТАТ:

Par1    ---> This is the parent. Needs to be shown only once.
Model1  -->  This is a model. List all models that belong to this parent. 
image_id 1 -> Show only 1 image of the model (model may have multiple images but I need just one) 

Model3  -->  This is a model.
image_id 5  -> Show only 1 image of the model    

Model4  -->  This is a model.
No Image    -> Note that no image exists for this model. So we show "No Image" text.

------------------------------------------------------------

Par2    ---> This is the parent. Needs to be shown only once.
Model2  -->  This is a model.
image_id 4  -> Show only 1 image of the model

Model5  -->  This is a model.
No Image   -> Note that no image exists for this model. So we show "No Image" text.

Мне нужен код PHP и mySQL для достижения вышеуказанного. Приветствуется любая помощь в решении проблемы.

Большое спасибо.

EDIT 1: Извините, я забыл добавить это. Я не объектно-ориентированный программист. Поэтому я был бы очень признателен, если бы вы могли избежать объектно-ориентированного кода в своем решении и показать мне то же самое без ошибок. Спасибо.


person Devner    schedule 15.07.2010    source источник
comment
Из того, что я прочитал в первом абзаце, я не понимаю, почему нужно показывать parent_name только один раз (что я интерпретирую как отображаемую только одну строку). Я уверен, что вы используете агрегат array_accum mysql (или как он там называется) для группировки всех моделей родителя в одном столбце и по одному изображению для каждой модели в другом столбце, но это не так выгодно. Что касается остального - tl; dr, но если вам нужен SQL-запрос, вы должны показать желаемый результат в табличной форме.   -  person Artefacto    schedule 16.07.2010
comment
@Artefacto Спасибо за ответ. Почему я хочу показать это только один раз, так это то, что я пытаюсь сгруппировать все модели под родительским элементом. Итак, если 100 моделей имеют 10 родителей по курсу 10 моделей/родитель, то вместо того, чтобы показывать имя родителя 100 раз (потому что у нас есть 100 моделей), я просто хочу показать имя каждого родителя только один раз и показать 10 моделей, соответствующих этому родителю под ним. Мне действительно все равно, нужно ли это показывать в таблице или в макете на основе div. Мне просто нужен вывод. Я почти там, за исключением того, что имя Родителя продолжает повторяться, и мне нужно избегать этого.   -  person Devner    schedule 16.07.2010
comment
ОК, теперь я понимаю, что вы не обязательно хотите выполнять эту избыточность только в SQL. Тогда ответ Кау-Боя выглядит хорошо. Он по-прежнему будет извлекать 100 строк, но затем сгруппирует их в массив PHP.   -  person Artefacto    schedule 16.07.2010


Ответы (1)


Вы можете сделать это в одном запросе, а затем объединить его в ассоциативный массив:

$query = '  SELECT     *
            FROM       parent AS p
            LEFT JOIN  model AS m
            ON         p.id = m.parent_id
            LEFT JOIN  model_images AS m_i
            ON         m.model_id = m_i.model_id';

$array = array();

if($mysli->query($quer)){
    while($row = $result->fetch_assoc()){
        $array[$row['parent_name']][$row['model_id']] = $row;
    }
}

У вас будет ассоциативный массив с родительским именем в качестве ключа массива. Затем вы можете использовать цикл for для печати ключа только один раз (с $i = 0), но остальное значение по значению.

Это достаточно ясно?

EDIT: ваш массив может выглядеть так:

Array(
  'Par 1' => 
    Array(
      [0] => Array(
        'parent_id' => 1,
        'parent_name' => 'Par 1',
        'model_id' => 1,
        'model_name' => 'Model 1',
        'image_id',
      ),
      [1] => Array(...)
    ),
    'Par 2' => Array(...)
)

Итак, чтобы распечатать, вам нужно две петли. Один для родителей (и там имена) и один для их детей (в данном случае моделей).

foreach($array as $par_name => $models){
    echo 'Parent name: '.$par_name.'<br />';
    echo 'Model ID: '.$models[0]['model_id'].', Model Name: '.$models[0]['name']; // replace with your desired output
}

Теперь представление о том, как это работает? Конечно, как сказал Artefacto, вы можете использовать процедурные функции, если вам не нравятся функции ООП.

person 2ndkauboy    schedule 15.07.2010
comment
Спасибо за ваш ответ. Извините, я не понимаю код, который вы предоставили (и это связано с моим непониманием программирования на основе ООП). Я также отредактировал свой вопрос, чтобы отразить то же самое. Не могли бы вы показать мне то же самое без ООП? - person Devner; 16.07.2010
comment
@Denver Если вы не хотите использовать ООП, просто используйте mysqli_query и mysqli_fetch_assoc вместо вызовов методов. - person Artefacto; 16.07.2010
comment
@Artefacto Я разместил ответ в комментарии ниже. Пожалуйста, проверьте это. - person Devner; 16.07.2010
comment
Пожалуйста, смотрите мой РЕДАКТИРОВАТЬ 1 ниже. Спасибо. - person Devner; 16.07.2010