Dlaczego zapytanie EAV nie działa ?

0

Czesć,

zrobiłem sobie tabelkę typu key->value i teraz próbuję wyciągnąć wiersze odpowiadające porównaniu dwóch kluczy wraz z wartościami

SELECT `product`.* FROM `product` LEFT JOIN `product_trait` ON `product`.`id` = `product_trait`.`product_id` WHERE 
AND (`product_trait`.`name` = 'klimatyzacja' AND `product_trait`.`value` = 'tak')
AND (`product_trait`.`name` = 'hak_holowniczy'  AND `product_trait`.`value` = 'nie')
 

grupuję warunki w nawiasach więc powinno działać

0

Na sam początek zawsze zaczynaj od sformatowania kodu.
Jak mniemam błąd masz składniowy i teraz być może go dostrzeżesz:

SELECT
	`product`.*
	
FROM
	`product`
	
LEFT JOIN
	`product_trait` ON
		`product`.`id` = `product_trait`.`product_id`
		
WHERE 
	AND (`product_trait`.`name` = 'klimatyzacja' AND `product_trait`.`value` = 'tak')
	AND (`product_trait`.`name` = 'hak_holowniczy' AND `product_trait`.`value` = 'nie')
 

(btw, trait to średnia nazwa dla modelu EAV, jako iż wyraźnie w EAV występuje słowo attribute, a nie trait :-P)

0
Patryk27 napisał(a):

Na sam początek zawsze zaczynaj od sformatowania kodu.
Jak mniemam błąd masz składniowy

Wiem, że chodzi Ci o to AND, ale to przez modyfikowanie kodu w odpowiedzi, bo jeszcze w kluzuli where mam jeden nieistotny warunek który usunąłem dla lepszej czytelności.

Wiem już gdzie popełniłem błąd, dla każdego atrybutu muszę zrobić odrębny JOIN na tabeli, ale nie wiem czy to będzie najlepszym wyjściem

0

Można zrobić pivota na tabeli eav (http://stackoverflow.com/questions/21836757/join-pivot-items-with-eav-table) i później jednego join-a:

SELECT
    `product`.*
 
FROM
    `product`
LEFT JOIN
    `pvt_product_trait` ON
        `product`.`id` = `pvt_product_trait`.`product_id`
 
WHERE 
    klimatyzacja = 'tak'
    AND hak_holowniczy'  'nie'
 
0
Panczo napisał(a):

Można zrobić pivota na tabeli eav (http://stackoverflow.com/questions/21836757/join-pivot-items-with-eav-table) i później jednego join-a:

Ok, ale jak mam potem zrobić porównanie wartości, jak użyję WHERE klima='tak' AND hak='tak' to mi wyrzucić błąd z info o używaniu nieistniejącej kolumnie

select product.name,
 max(case when pt.name_mapped = 'klimatyzacja' then pt.value end) klima, 
max(case when pt.name_mapped = 'hak holowniczy' then pt.value end) hak, 
max(case when pt.name_mapped = 'cena' then pt.value end) cena 
from product left join product_trait pt on pt.product_id = product.id 
group by product.id 
 

klima, hak, cena jest widoczna dopiero w HAVING ale tam są ograniczenia jeżeli chodzi o porównywanie

0

join z pivotem:

SELECT
    *
FROM 
    product 
    LEFT JOIN (SELECT 
                    product_id,
                    MAX(CASE WHEN name_mapped = 'klimatyzacja' THEN VALUE END) klima, 
                    MAX(CASE WHEN name_mapped = 'hak holowniczy' THEN VALUE END) hak, 
                    MAX(CASE WHEN name_mapped = 'cena' THEN VALUE END) cena 
                FROM
                    product_trait 
                GROUP BY 
                    product_id ) pt ON pt.product_id = product.id 
WHERE    
    KLIMA = 'TAK'
    AND HAK='NIE' 

1 użytkowników online, w tym zalogowanych: 0, gości: 1