/ / Запит на базу даних EAV генерує занадто багато "null" s - mysql, sql, база даних, агрегат, сутність-атрибут-значення

Запит на базу даних EAV створює забагато "null" s - mysql, sql, database, aggregate, entity-attribute-value

Я декілька днів намагаюся створитизапит для згаданої бази даних Entity-Attribute-Value, і я трохи заржавів з sql, тому навіть після багатьох досліджень я не зможу отримати запит робити саме так, як я хочу.

Важливі частини таблиці виглядають так:

Ідентифікатор | концепція | модифікатор 1 | абс: 10 | @ 2 | абс: 22 | @ 2 | абс: 22 | t: f 2 | абс: 78 | @ 2 | абс: 78 | t: x 3 | kfg: 12 | @ 4 | aqx: 23 | @ 5 | абс: 49 | @ 5 | абс: 49 | t: f 5 | абс: 49 | т: г

Я хочу такий стіл:

Ідентифікатор | концепція | mod_f | mod_other 1 | абс: 10 | нульовий | нуль 2 | абс: 22 | t: f | нуль 2 | абс: 78 | нульовий | t: x 5 | абс: 49 | t: f | т: г

Мої спроби змусили мене вже до цього результату:

Ідентифікатор | концепція | mod_f | mod_other 1 | abc:10 | нульовий | нуль 2 | абс: 22 | t: f | нуль 2 | абс: 22 | нульовий | нуль 2 | абс: 78 | нульовий | t: x 2 | абс: 78 | нульовий | нуль 5 | абс: 49 | t: f | нуль 5 | абс: 49 | t: f | т: г 5 | абс: 49 | нульовий | т: г 5 | абс: 49 | нульовий | нуль

Ось код, який дав мій результат:

ВИБІРТЕ t.ID, t.concept, t.modifier, випадок, коли т.концепція LIKE "abc:%" і t.modifier = "@", тоді t.concept закінчується AS "концепція", випадок, коли t2.modifier = "t: f", тоді t2.modifier закінчується AS "mod_f", випадок, коли t3.modifier LIKE "t:%", тоді t3.modifier закінчується AS "mod_other" З таблиці, як t Ліва приєднайтесь до таблиці як t2 ON t.ID = t2.ID і t.concept = t2.concept Ліва приєднайтесь до таблиці як t3 ON t2.ID = t3.ID і t2.concept = t3.concept ДЕ t.concept LIKE "abc:%" і t.modifier = "@" і (t2.modifier LIKE "t: f" або t2.modifier = "@") і (t3.modifier = "t: g" або t3.modifier = "t: x" або t3.modifier = "@")
ЗАМОВЛЕННЯ по t.ID asc;

Виправлення виглядає легко, але все, що я маюСпробував зменшити результати внизу, ніж те, що я хочу (в основному видаляє занадто багато рядків), і на даний момент я більше не знаю, що мені потрібно шукати.

Також частина "регістру" у запиті виглядає якбрудне рішення, яке я десь знайшов і використовував, оскільки він працює (робить "@" в "null"), тому якщо у вас є якісь пропозиції зробити запит більш чистим, сміливо відповідайте.

Відповіді:

0 для відповіді № 1

Гаразд, я знайшов відповідь, і це було легше, ніж я думав.

GROUP by - це відповідь. Я думав, що це не допоможе працювати над текстом, але ви можете насправді об'єднати заяви з вибору регістру тексту макс подобається це:

ВИБРАТИ t.ID, t.concept, t.модифікатор, max (випадок, коли t.concept LIKE "abc:%" і t.modifier = "@", тоді t.concept закінчується) AS "концепція", max (випадок, коли t2.modifier = "t: f", тоді t2.modifier кінець) AS "mod_f", max (випадок, коли t3.modifier LIKE "t:%", тоді t3.modifier end) AS "mod_other" З таблиці, як t Ліва приєднайтесь до таблиці як t2 ON t.ID = t2.ID і t.concept = t2.concept Ліва приєднайтесь до таблиці як t3 ON t2.ID = t3.ID і t2.concept = t3.concept ДЕ t.concept LIKE "abc:%" і t.modifier = "@" і (t2.modifier LIKE "t: f" або t2.modifier = "@") і (t3.modifier = "t: g" або t3.modifier = "t: x" або t3.modifier = "@") ГРУПА за t.ID, t.concept, t.modifier ЗАМОВИТИ по t.ID asc;

Це отримує мені саме стіл, який я шукав. Але це працює лише тому, що mod_other може містити лише 1 код на концепцію.