Użyłeś tabeli Jednostka-Atrybut-Wartość do zarejestrowania swoich atrybutów.
To jest przeciwieństwo normalizacji.
Nazwij zasadę normalizacji, która poprowadziła Cię do umieszczenia różnych atrybutów w tej samej kolumnie. Nie możesz, ponieważ to nie jest praktyka normalizacji.
Aby wykonać zapytanie z obecnym projektem EAV, musisz przestawić wynik tak, aby uzyskać coś, jakbyś miał oryginalną tabelę.
SELECT * FROM (
SELECT
a.article_id,
a.title,
MAX(CASE attr_group WHEN 'ref_id' THEN attribute END) AS ref_id,
MAX(CASE attr_group WHEN 'dial_c_id' THEN attribute END) AS dial_c_id
-- ...others...
FROM test.articles_test a
INNER JOIN attributes attr ON a.article_id = attr.article_id
GROUP BY a.article_id, a.title) AS pivot
WHERE pivot.ref_id = '127712'
AND pivot.dial_c_id = 51
Chociaż powyższe zapytanie może przynieść pożądany wynik, wydajność będzie straszna. Musi utworzyć tabelę tymczasową dla podzapytania, zawierającą wszystkie dane z obu tabel , a następnie zastosuj klauzulę WHERE do tabeli tymczasowej.
Naprawdę lepiej jest z każdym atrybutem w osobnej kolumnie w oryginalnej tabeli.
Rozumiem, że w przyszłości próbujesz uwzględnić wiele atrybutów. To powszechny problem.
Zobacz moją odpowiedź na Jak zaprojektować tabelę produktów dla wielu rodzajów produktów, gdzie każdy produkt ma wiele parametrów
Ale nie powinieneś nazywać tego „znormalizowanym”, ponieważ tak nie jest. Nie jest nawet zdenormalizowany . To derelacja .
Nie możesz po prostu użyć słów do opisania czegokolwiek, co chcesz — zwłaszcza przeciwieństwa tego, co oznacza słowo. Nie mogę wypuścić powietrza z opony rowerowej i powiedzieć „napompuję ją”.
Skomentowałeś, że próbujesz „skalować” swoją bazę danych. Nie rozumiesz również, co oznacza słowo „skalowalne”. Używając EAV, tworzysz strukturę, w której potrzebne zapytania są trudne do napisania i nieefektywne do wykonania, a dane zajmują 10x miejsca. To przeciwieństwo skalowalności.
Masz na myśli to, że próbujesz stworzyć system, który jest rozszerzalny . Jest to skomplikowane do zaimplementowania w SQL, ale opisuję kilka rozwiązań w innej odpowiedzi na Stack Overflow, z którą się połączyłem. Może Ci się również spodobać moja prezentacja Rozszerzalne modelowanie danych za pomocą MySQL .