У меня три таблицы, и я бы хотел выбрать из таблиц без дубликатов.
Таблица выглядит следующим образом:
Клиенты
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, иначе невозможно связать элемент с его рейтингом.