MySQL, not EXISTS. Звірка наявності перекладу

Не все у світі крутиться навколо WordPress. Іноді девелопер вирішує задачі самописним кодом.

Вчора мав цікаву задачу: перекласти опис з польської на українську, 9,166 записів.

Таблиця з перекладами має ось таку структуру.
+– +—————+——————+————+————–+
| id | ProductID | ProductLang | metaKey | metaValue |
+– +—————+——————+————+————–+

Логіка магазину така, що один товар може мати кілька елементів опису (опис, склад, рекомендації, параметри). Відтак, через колонку metaKey ми зазначаємо тип опису і через metaValue — сам опис відповідно.

ProductID та ProductLang — це прив’язка до товару та зазначена мова відповідно. id — ключовий параметр для даної таблиці.

Алгоритм взаємодії з перекладачем ми розглянемо в окремій публікації. Завдання конкретно цього підходу полягатиме в тому, щоб вибрати елементи перекладу, які не мають відповідника. Зробити це можна ось таким запитом:

mysql_query("
SELECT * FROM ProductsDescription m WHERE not EXISTS (
SELECT ProductID FROM ProductsDescription s WHERE 
 m.ProductID = s.ProductID
 and s.metaKey = m.metaKey
 and s.ProductLang = 'uk'
 )
limit 10

");

Розбираємо на складові:

SELECT * FROM ProductsDescription m

тут ми вибираємо всі дані з таблиці ProductsDescription, якій присвоюємо псевдонім m.

WHERE not EXISTS (
SELECT ProductID FROM ProductsDescription s WHERE

Тепер починається магія — виставляємо умову: WHERE not EXISTS, в якій зазначаємо, що остаточний результат повинен не мати дубляжу в наступному запиті — тут ми зсилаємось на цю ж таблицю, а опісля зазначаємо умови вибірки:

  • m.ProductID = s.ProductID — уточнюємо прив’язку до конкретного товару;
  • and s.metaKey = m.metaKey — metaKey в основному запиті та підзапиті має співпадати;
  • and s.ProductLang = ‘uk’ — це фінальне уточнення, яке дає знати, що нас цікавлять саме ті описи, які ще не мають українського перекладу.

І остання умова дозволить Вам не перегружати систему. Хоча, при бажанні та поспіху можна збільшити ліміт до 50-100 запитів.

limit 10

Залишити відповідь