Jump to content
php.lv forumi

MySQL produktu atribūti


Sasa

Recommended Posts

Nu tad ieliec, kā tev tagad pieprasījums izskatās!

Bez tās tabulas, subquery būtu ar ko līdzīgu WHERE product_has_specification.spec_id = 1.

 

Ja tas `name` tev ir vajadzīgs, tad uzliec uz šo lauku indeksu, turklāt šai tabulai tev ir lieks indekss laukam id_specification, jo tas jau ir Primary Key.

Tad vari rakstīt šādi:

SELECT DISTINCT products.* 
FROM products
WHERE
products.product_id IN (
	SELECT product_has_specification.product_id
	FROM product_has_specification
	WHERE product_has_specification.value='black'
	AND product_has_specification.spec_id IN (
		SELECT specifications.id_specification
		FROM specifications
		WHERE specifications.`name` = 'color'
	)
)
AND
products.product_id IN (
	SELECT product_has_specification.product_id
	FROM product_has_specification
	WHERE product_has_specification.value='s'
	AND product_has_specification.spec_id IN (
		SELECT specifications.id_specification
		FROM specifications
		WHERE specifications.`name` = 'size'
	)
)
Edited by e-remit
Link to comment
Share on other sites

Es netiecos pēc īsākā koda, bet pēc optimālākā.

Optimālākais varētu būt nelietot šādu datu struktūru meklēšanai, jo jo vairāk dažādas specifikācijas pēc kura produkti tiks meklēti, jo "neoptimālāk" viss paliks.

 

 

Vispārīgi runājot MySQLam diemžēl nav INTERSECT (kā MS SQL ( https://msdn.microsoft.com/en-us/library/ms188055.aspx)) t.i. atlasīt visus elementus, kuri atbilstu visām prasībām (subselectiem). MySQLā to (bieži) risina ar INNER JOIN taču no performances viedokļa UNION ALL selects un tad grupējot atlasīt elementus kuriem HAVING count(*) >= [parametu skaits] (līdzīgs piemērs, jau diskusijā minēts http://php.lv/f/topic/22133-mysql-produktu-atrib%C5%ABti/#entry176474 ) varētu būt ātrāks:

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...