PHP, MySQL: нужно показывать имя родителя только один раз .. почти там, но все еще проблема - PullRequest
0 голосов
/ 16 июля 2010

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

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

Я в основном пытался написать 2 запроса.Один из них состоял в том, чтобы оставить «родительскую» таблицу для «моделей» и использовать GROUP BY parent_id, а затем в цикле while написать другой запрос, чтобы получить только 1 изображение, используя соединение таблиц моделей и изображений с помощью поля model_id.Но при этом перечисляется только 1 модель, хотя существует несколько моделей.Поэтому я попытался использовать GROUP BY parent_id, model_id.Использование этого действительно показывает все модели, но в то же время, также повторяется, показывая parent_name, и мне нужно, чтобы parent_name показывался только один раз по всей странице.Вы можете сказать, что я пытаюсь Сгруппировать имя модели под родителем и показать все модели с одним родителем, и я показываю только 1 изображение модели.Если каким-то образом я смогу избежать многократного отображения 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 для достижения вышеизложенного.Приветствуется вся помощь в решении проблемы.

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

РЕДАКТИРОВАТЬ 1: Извините, я забыл добавить это.Я не объектно-ориентированный программист.Поэтому я был бы очень признателен, если бы вы смогли избежать объектно-ориентированного кода в своем решении и показать мне то же самое без опа.Спасибо.

1 Ответ

1 голос
/ 16 июля 2010

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

$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), а остальное - значением.

Достаточно ли ясно?

РЕДАКТИРОВАТЬ : Ваш массив может выглядеть следующим образом:

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
}

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

...