#mysql #join #left-join
Вопрос:
В моей базе данных MySQL у меня есть 5 таблиц
Таблица: Продукт
product_id | имя продукта |
---|---|
1 | па |
2 | пб |
3 | ПК |
4 | палладий |
3031 | PE |
Таблица: Product_to_category (Продукт — Эта таблица — Отношение одного к другому)
product_id(основной ключ) | идентификатор категории(основной ключ) |
---|---|
1 | A |
2 | B |
3 | C |
3031 | 439 |
3031 | 683 |
Таблица: Категория
category_id | parent_id | слизень |
---|---|---|
71 | 0 | 71-аа |
161 | 71 | 161-аа |
439 | 161 | 439-аа |
680 | 0 | 680-аа |
683 | 680 | 683-аа |
Таблица: Category_description (Категория — Это отношение таблицы к одному)
category_id | имя категории |
---|---|
71 | пт |
161 | Сплит-система переменного тока |
439 | 1ТонАК |
680 | Предложение |
683 | Саммерчилл |
Таблица: Путь к категории
идентификатор категории(основной ключ) | идентификатор пути(primary_key) | Уровень |
---|---|---|
439 | 71 | 0 |
439 | 161 | 1 |
439 | 439 | 2 |
683 | 680 | 0 |
683 | 683 | 1 |
Я хотел бы получить такие результаты, как
product_id | имя продукта | category_id | category_name | слизень |
---|---|---|---|---|
3031 | PE | 71,161,439 | Защитная камера / Переменный ток, Защитная камера / Переменный ток/ Сплит переменного тока, Защитная камера / Переменный ток / Сплит переменного тока / 1TonAc | 71-аа,161-аа,439-аа |
Примечание: Здесь 683 игнорируется, потому что существует более одной категории продукта. Но мое требование относится только к первой категории. Вот почему 683 был проигнорирован. Если невозможно игнорировать 683, то это должно быть разрешено, например, 439 Другое дело, что мне нужен GROUP_CONCAT(имя категории), потому что я хотел бы импортировать свои существующие данные электронной коммерции(Opencart CMD) в Magento 2. Данный шаблон результата представляет собой образец файла импорта для Magento 2.
category_name должно быть таким шаблоном
«Строка категории по умолчанию» разделитель ( / ) Разделитель категории «Уровень 0» Запятая(,)
«Строка категории по умолчанию» разделитель ( / ) Разделитель «Категория 0 — го уровня/Категория 1 — го уровня» Запятая(,)
«Строка категории по умолчанию» разделитель (/) «Категория уровня 0/Категория уровня 1/Категория уровня 2» разделитель Запятая(,)
Комментарии:
1. Почему ваш ожидаемый результат включает категорию 61, если ее не существует (пожалуйста, дважды проверьте все на опечатки)? Почему категория 683, кажется, игнорируется, или «Категория по умолчанию», кажется, волшебным образом появляется (пожалуйста, объясните свои требования, а не просто сбрасывайте стену данных в качестве примера)? Почему вам нужно несколько результатов в одной строке и столбце (списки, разделенные запятыми, являются анти-шаблоном SQL)?
2. Извините, я обновил информацию. Его должно быть 161
3. существует более одного продукта. Но мне нужен только первый. вот почему 683 был проигнорирован.
4. Наборы данных SQL неупорядочены; нет первой категории (не продукта), вы имеете в виду ту, у которой самый низкий идентификатор на продукт?
5. Да, самый низкий идентификатор.
Ответ №1:
Используйте GROUP_CONCAT
вместе с LEFT JOIN
. Я не знаю, возвращает ли это правильный вывод, так как это непроверенный код, но логика запроса может вам помочь.
SELECT a.product_id, product_name, GROUP_CONCAT(b.category_id) AS 'category_id',
REPLACE(GROUP_CONCAT(c.category_name), ',', '/') AS 'category_name',
GROUP_CONCAT(c.slug) AS 'slug' FROM product a
LEFT JOIN product_to_category b ON a.product_id=b.product_id
LEFT JOIN category c ON c.category_id=b.category_id
LEFT JOIN category_description d ON c.category_id=d.category_id
WHERE product_id=3031;
Комментарии:
1. @ShojibFlamon ты имеешь в виду без
GROUP_CONCAT
?2. да, это работает, но мое требование-category_name. Это должен быть такой шаблон <Строка категории по умолчанию ><Строка категории по умолчанию ><разделитель / ><разделитель / ><Категория 0 — го уровня> <Категория 0 — го уровня><разделительная запятая> <разделительная запятая><Строка категории по умолчанию ><Строка категории по умолчанию ><разделитель / ><разделитель / ><Категория 0 — го уровня/Категория 1 — го уровня> <Категория 0 — го уровня/Категория 1 — го уровня><Разделительная запятая> <разделительная запятая><Строка категории по умолчанию ><Строка категории по умолчанию ><разделитель / ><разделитель / ><Категория 0 — го уровня/Категория 1 — го уровня/Категория 2 — го уровня> <Категория 0 — го уровня/Категория 1 — го уровня/Категория 2 — го уровня><разделительная запятая>