Mysql – выбор из нескольких таблиц без дублирования данных

У меня три таблицы, и я бы хотел выбрать из таблиц без дубликатов.

Таблица выглядит следующим образом:

Клиенты

id | name | lastName --------------------------------------- 1 | john | doe 2 | helen | keller 

заказы

Столбец userID – это внешний ключ, который ссылается на John Doe, поэтому Джон заказывает 3 элемента.

 id | userID | order --------------------------------------- 1 | 1 | pizza 2 | 1 | pasta 3 | 1 | lasagna 

CustomerRating

Столбец userID – это внешний ключ, который ссылается на John Doe, поэтому John оставляет 5 отзывов.

  id | userID | rating | comment ------------------------------------------------- 1 | 1 | 5/5 | was good 2 | 1 | 5/5 | excellent 3 | 1 | 4/5 | great 4 | 1 | 4/5 | great 5 | 1 | 4/5 | great 

Как я могу выбрать из трех таблиц, где я могу получить результаты возврата, которые выглядят так?

 id | name | lastName | order | rating ----------------------------------------------------------------- 1 | john | doe | pasta | 5/5 | | | pizza | 5/5 | | | lasagna | 4/5 | | | | 4/5 | | | | 4/5 

Я попытался присоединиться к этим таблицам, но поскольку Джон оставил 5 обзоров и только заказывал 3 раза, столбцы id, name, lastName и order заполняются дублирующимися данными.

Благодаря!

У меня нет опыта работы в MySQL, но я предполагаю, что он работает аналогично MSSQL.

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

Вот аналогичный вопрос, который может помочь вам

включая пример, основанный на ссылке, попробуйте что-то вроде этого

SELECT Customers.id, Customers.name, Customers.lastName, GROUP_CONCAT(Orders.order) OrderedDishes, GROUP_CONCAT(CustomerRating.rating) RatingsGiven FROM ..... rest of your query .....

Есть способы отменить дубликаты ( SELECT DISTINCT , UNION , GROUP BY ), но неясно, обновляют ли пользователи существующий рейтинг или создают новые. И то, что вы хотите увидеть: последний рейтинг или средний

С другой стороны – я бы изменил всю вашу настройку:

  • таблица order будет содержать order_id , customer_id и другие вещи, связанные с заказом, такие как order_date

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

  • таблица order_products с поля order_id и prduct_id

  • если пользователи оценивают товары, то вашей таблице рейтинга потребуется как минимум product_id , customer_id , rate_value . Я бы также добавил ratingDate Таким образом, вы можете получить средние значения или выбрать последний по Max(ratingDate)

Я думаю, вам нужно добавить поле orderID в таблицу CustomerRating, иначе невозможно связать элемент с его рейтингом.