Форум программистов, компьютерный форум, киберфорум
MySQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 28.06.2019
Сообщений: 2

Если отсутствует значение получить значение из имеющихся доступных

28.06.2019, 14:35. Показов 1362. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Структура таблиц:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
products (
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID товара',
  price DECIMAL(19, 2) DEFAULT NULL COMMENT 'Розничная цена',
)
 
products_lang (
 
  product_id INT(11) UNSIGNED DEFAULT NULL,
  lang CHAR(3) DEFAULT NULL,
  name VARCHAR(160) DEFAULT NULL,
 
  CONSTRAINT FK_products_lang_product_id FOREIGN KEY (product_id)
  REFERENCES products (id) ON DELETE CASCADE ON UPDATE CASCADE
)
для каждого товара имеется 3 версии названия на каждом языке (языки на данный момент: ru,uk,en лежат в lang)

НО не у всех товаров может быть заполнены все версии языков.

задача - получить все товары (например, товаров 10 шт.) с определенным языком, если нет такого языка, брать значение с любым другим языком ДЛЯ ЭТОГО товара. Другими словами, если отсутствует значение для определенного языка, надо получить другое значение из имеющихся доступных языков для определенного товара.

==========

Например, все товары имеют русский перевод, а вот украинский у некоторых отсутствует. Надо, чтобы вместо украинского name был заменен на name с русским значением

делаю такой запрос

SQL
1
2
3
4
5
6
7
8
9
SELECT
  products.id,
  products_lang.name,
  products_lang.lang
FROM products
  LEFT OUTER JOIN products_lang
    ON products.id = products_lang.product_id
    AND products_lang.lang = 'uk'
    GROUP BY products.id
получаю такой результат (где указано красным, там должны быть строки с доступным переводом на любом языке для этого товара)
Миниатюры
Если отсутствует значение получить значение из имеющихся доступных  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.06.2019, 14:35
Ответы с готовыми решениями:

Если запись в столбце существует, то ничего не делать, если запись отсутствует, то записать нужное значение. Как реализовать?
Если запись в столбце существует, то ничего не делать, если запись отсутствует, то записать нужное значение. Как реализовать?

По массиву А получить массив В, присвоив его k элементу значение true, если выполнено указанное ниже условие и значение false
По массиву А получить массив В, присвоив его k элементу значение true, если выполнено указанное ниже условие и значение false иначе:...

SQL: обнулить значение, если оно не пустое и отсутствует в другой таблице
Подскажите, пожалуйста, как с помощью sql-запроса обнулить значение, если оно не пустое и отсутствует в другой таблице? Конкретно: в...

2
Эксперт MS Access
 Аватар для ltv_1953
17536 / 7288 / 1663
Регистрация: 21.06.2012
Сообщений: 13,957
29.06.2019, 06:43
Вариант (порядок выбора названия uk, ru, en):
SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT products.id, products_lang.name, products_lang.lang
FROM products, products_lang
WHERE products.id=products_lang.product_id AND products_lang.lang='uk'
UNION ALL
SELECT products.id, products_lang.name, products_lang.lang
FROM products, products_lang
WHERE products.id=products_lang.product_id AND products_lang.lang<>'uk' AND products_lang.lang='ru'
UNION ALL
SELECT products.id, products_lang.name, products_lang.lang
FROM products, products_lang
WHERE products.id=products_lang.product_id AND products_lang.lang<>'uk' AND products_lang.lang<>'ru' AND products_lang.lang='en'
1
0 / 0 / 0
Регистрация: 28.06.2019
Сообщений: 2
29.06.2019, 13:13  [ТС]
Спасибо, ltv_1953, за вариант.

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

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
SELECT
    products.*,
    currency.name AS currency_tag,
    products_types.name AS product_type_name,
    products_type_stock.name_lang AS product_type_stock_name,
    products_types.name_lang AS product_type_name_lang,
    products_type_units.name_lang AS product_type_unit_lang,
    products_type_sale.name_lang AS product_type_sale_lang,
    products_status.name AS product_status_name,
    products.is_options,
    products.discount_id,
    products.discount_options,
    products.on_showcase,
    products.vk_sync,
    products.price_old_percent,
    products.price_old_options,
    products.country_id,
    products.hit_sale,
    discounts.products_all,
    discounts.name,
    discounts.discount,
    discounts.discount_type,
    discounts.discount_start,
    discounts.discount_end,
    products.warehouse_id,
    products.warehouse_options,
    adjacency_lists.category_name,
    currency.currency_name,
    categories.category_main_name,
    shops.shop_name,
    users.email,
    users.first_name,
    users.last_name,
    users.avatar,
    users.avatar_type,
    users.phone
FROM (SELECT
    products.id,
    products.is_options,
    products.discount_id,
    products.discount_options,
    products.price_old_percent,
    products.price_old_options,
    products.country_id,
    products.hit_sale,
    products.on_showcase,
    products.vk_sync,
    products.currency_id,
    products.category_id,
    products.category_main_id,
    products.shop_id,
    products.user_id,
    products.type_id,
    products.stock_id,
    products.unit_id,
    products.type_sale_id,
    products.note_currency_id,
    products.status_id,
    products.warehouse_id,
    products.warehouse_options,
    products.slug,
    products.price,
    products.price_wholesale,
    products.stock_num,
    products.sku,
    products.video_link,
    products.trash,
    products.deleted,
    products.ban,
    products.approve,
    products.reject,
    products.sales,
    products.views,
    products.date_start,
    products.date_end,
    products.moneyback,
    products.note_price_buy,
    products.note_url_site,
    products.note_url_product,
    products.note_descr,
    products.term_prepend,
    products.pre_order,
    products.freebie,
    products.created,
    products.updated,
    products.order_by,
    products_lang.name AS product_name,
 
(SELECT GROUP_CONCAT(DISTINCT name) AS products_list FROM products_lang WHERE products_lang.product_id=products.id) AS product_names,
    (SELECT GROUP_CONCAT(DISTINCT name) AS categories_list FROM categories_lang WHERE categories_lang.category_id=products.category_main_id) AS categories_names,
      (SELECT GROUP_CONCAT(DISTINCT name) AS shops_list FROM shops_lang WHERE shops_lang.shop_id = '9') AS shops_names
  
  FROM products
    LEFT OUTER JOIN products_lang
      ON products_lang.product_id = products.id
      AND products_lang.lang = IF(products_lang.lang = 'ru','ru',NULL)
      
  ) products
 
  LEFT OUTER JOIN (SELECT
      currency.id,
      currency.name,
      currency_lang.name AS currency_name
    FROM currency
      LEFT JOIN currency_lang
        ON currency.id = currency_lang.currency_id
            AND currency_lang.lang = IF(currency_lang.lang = 'ru','ru',NULL)) currency
    ON products.currency_id = currency.id
  LEFT OUTER JOIN (SELECT
      adjacency_lists.id,
      adjacency_lists_lang.name AS category_name
    FROM adjacency_lists
      LEFT JOIN adjacency_lists_lang
        ON adjacency_lists.id = adjacency_lists_lang.al_id
          AND adjacency_lists_lang.lang = IF(adjacency_lists_lang.lang = 'ru','ru',NULL)) adjacency_lists
    ON products.category_id = adjacency_lists.id
  LEFT OUTER JOIN (SELECT
      categories.id,
      categories_lang.name AS category_main_name
    FROM categories
      LEFT JOIN categories_lang
        ON categories.id = categories_lang.category_id
        AND categories_lang.lang = IF(categories_lang.lang = 'ru','ru',NULL)) categories
    ON products.category_main_id = categories.id
  LEFT OUTER JOIN (SELECT
      shops.id,
      shops_lang.name AS shop_name
    FROM shops
      LEFT JOIN shops_lang
        ON shops.id = shops_lang.shop_id
        AND shops_lang.lang = IF(shops_lang.lang = 'ru','ru',NULL)) shops
    ON products.shop_id = shops.id
  LEFT OUTER JOIN users
    ON products.user_id = users.id
  LEFT OUTER JOIN products_types
    ON products.type_id = products_types.id
  LEFT OUTER JOIN products_type_stock
    ON products.stock_id = products_type_stock.id
  LEFT OUTER JOIN products_type_units
    ON products.unit_id = products_type_units.id
  LEFT OUTER JOIN products_type_sale
    ON products.type_sale_id = products_type_sale.id
  LEFT OUTER JOIN products_status
    ON products.status_id = products_status.id
  LEFT OUTER JOIN discounts
    ON products.discount_id = discounts.id
 
WHERE products.shop_id = '9' 
  AND products.id = 2064
  GROUP BY products.id
Разберем по порядку (только актуальные строки).
Получаем данные из всех полей со всеми переводами по необходимому для запроса условию (рассматриваем для товаров).

SQL
1
(SELECT GROUP_CONCAT(DISTINCT name) AS products_list FROM products_lang WHERE products_lang.product_id=products.id) AS product_names
далеее "джойним" к товару актуальный язык и если такого нет, присваиваем NULL

SQL
1
2
3
4
  FROM products
    LEFT OUTER JOIN products_lang
      ON products_lang.product_id = products.id
      AND products_lang.lang = IF(products_lang.lang = 'ru','ru',NULL)

Вся магия кроется при получении результатов запроса в обработчике, например в PHP по следующему сценарию.
- Получаем результат такого вида (на скрине)
- Например для названия товара: если название отсутствует в поле product_name (присвоено NULL), значит берем первый результат из поля product_names.

PHP
1
2
$p_names = explode(",", $result['product_names'];
$product_name = ($result['product_name']) ? $result['product_name'] : $p_names[0]);

Стараюсь сделать, чтобы все было очень гибко, лаконично и нересурсоемко, так как работать предстоит с 9-ю языками.
Миниатюры
Если отсутствует значение получить значение из имеющихся доступных  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.06.2019, 13:13
Помогаю со студенческими работами здесь

Присвоить логической переменной T значение true, если значение d-цифра, и значение false в противном случае
Имеется символьная переменная d, присвоить логической переменной T значение true, если значение d-цифра, и значение false в противном...

Переменной k логического типа присвоить значение true в том случае, если массив n целых чисел упорядочен по возрастанию, i значение false если нет
Условие задачи: Переменной k логического типа присвоить значение true в том случае, если массив n целых чисел упорядочен по возрастанию,...

Определённое значение из доступных данных
Имеется определённое кол-во данных: ...

Проверка если значение столбца hour = 1, то вывести текст, если значение столбца = 0, Как реализовать?
На сайте уже есть регистрация, авторизация. И нужно сделать если у пользователя который авторизован на данный момент (в сеcсии) в поле...

Получить значение из Json строки, если она возвращается массивом
Как можно получить id из json, если эта строка возвращает массив(я так понял, что это массив)? Вот возвращаемая строка:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru