Объединение 3 таблиц для создания списка профилей (HTML / PHP / MySQL) - PullRequest
0 голосов
/ 01 сентября 2018

Я изучаю PHP / MySQL, чтобы предоставлять информацию о / для местных фермеров через веб-сайт. К сожалению, я натолкнулся на два, казалось бы, хитрых препятствия, которые я изо всех сил стараюсь преодолеть.

У меня есть 3 таблицы: «pro_list» (ПЕРВИЧНЫЙ КЛЮЧ продюсер_ид ), «product_list» (ПЕРВИЧНЫЙ КЛЮЧ product_id ) и промежуточный «prod_to_prod» (ИНОСТРАННЫЕ КЛЮЧИ provider_id и product_id ), чтобы включить отношение многие ко многим между двумя другими.

Идея состоит в том, чтобы создать список div элементов, содержащих информацию (например, телефон, электронная почта, местоположение ...), взятую из «pro_list» и то, что они производят из «product_list», используя свой мост. с 'prod_to_prod' (поскольку один производитель может производить много продуктов, и один и тот же продукт может быть произведен многими разными производителями).

Мои проблемы начинаются уже с генерации базового запроса, который должен возвращать элегантный список производителей, используя мост в качестве ссылки (т. Е. Я хочу, чтобы в списке отображались только производители, у которых provider_id имеет product_id s, связанных с ним в 'prod_to_prod').
Как вы можете себе представить, код, который я использовал ...

<?php
$pagequery="SELECT * FROM pro_list 
            OUTER JOIN prod_to_prod 
            WHERE pro_list.producer_id=prod_to_prod.producer_id 
            LIMIT $offset, $num_of_cells";
$res_pagequery=mysqli_query($conn,$pagequery);    

while($proddiv=mysqli_fetch_array($res_pagequery))  {
echo "<div>
      ...Producer:".$proddiv['prod_firstname']."...
      </div>; 
}
?>

... вернул список с множеством дубликатов, так как provider_id s связано с различными product_id s в 'prod_to_prod'. Я пробовал многочисленные комбинации, используя SELECT DISTINCT, но пока все, что я получил, где сообщения об ошибках.

Я даже не знаю, как подойти к расширенному запросу (т.е. отобразить названия продуктов, связанных с каждым производителем, в соответствующем div , основываясь на ассоциациях pro_list.product_id = prod_to_prod .product_id AND product_list.product_id = prod_to_prod.product_id . Я предполагаю, что мне придется работать с UNION как минимум из двух SELECT, но, поскольку я получаю только дубликаты или ошибки, я даже не посмел бы попробовать ...

Как бы вы подошли к решению этой проблемы?

1 Ответ

0 голосов
/ 03 сентября 2018

Когда вы делаете (ВЛЕВО) ВНЕШНЕЕ СОЕДИНЕНИЕ, вы получаете как минимум одну строку для каждого Продукта, независимо от того, есть ли в prod_to_prod соответствующая строка. Вы хотите изменить это на ВНУТРЕННЕЕ СОЕДИНЕНИЕ, которое фактически является значением по умолчанию - вы просто используете JOIN.

Как вы заметили, вы получите строку в наборе результатов для каждого совпадения в prod_to_prod.

Если вы используете SELECT *, вы получите все столбцы, но, так как вам не нужны никакие столбцы из prod_to_prod, вы можете вместо этого указать конкретные столбцы, которые вы хотите, или вы можете указать SELECT pro_list.* При этом , DISTINCT будет полезен для устранения дубликатов, или вы можете использовать GROUP BY pro_list.producer_id, чтобы получить по одной строке на производителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...