Autor Zpráva
Kornout006
Profil *
Zdravím Vás,

aktuálně řeším jeden problém. Mám 3 tabulky.

Tabulka: category (id, name, ord)
Tabulka: products (id, name, description, keywords, date_from, date_to)
Tabulka: products_category (id, product_id, category_id )

-------------------------

V tabulce "products" přibývá stovka produktů denně, které jsou omezeny časově ( na webu se zobrazují dle data date_from, date_to )
A teď k problému. Každý produkt je přiřazen například k 5-10 kategoriím (products_category).

V tabulce products je teď cca 200 000 produktů.
V tabulce products_category je tedy cca 500 000 záznamů

---------------------------

Jak by jste prováděli příkazy, kdy bych potřeboval rychle načíst tyto údaje:

A) U každé kategorie počet produktů (tedy u výpisu kategorií se provádí tento script, samozřejmě poměrně dlouho :/ )

SELECT COUNT(*) FROM products WHERE  date_to > ".time()." AND id IN ( SELECT product_id FROM products_category WHERE category_id = $aktualni_kategorie ) 


B) Výpis produktů v kategorii:


SELECT * FROM products WHERE  date_to > ".time()." AND id IN ( SELECT product_id FROM products_category WHERE category_id = $aktualni_kategorie ) ORDER BY date_to DESC LIMIT 0, 100 
Zechy
Profil
Kornout006:
Je nějaký důvod proč nepoužít JOINy, ale spoustíš poddotazy? SELECT IN s poddotazem není nejlehčí operace.
Kornout006
Profil *
Propojování více tabulek s joiny mi nikdy moc nešlo, proto si chci nechat poradit :-D
Zechy
Profil
Kornout006:
Je to jednoduché:
SELECT COUNT(product.id)
FROM product
JOIN products_category ON product.id = products_category.product_id
WHERE product.date_to > "[tvá_proměnná_s_časem]" AND products_category.category_id = "[tvá proměnná s kategorií]"

Něco ti ušetří i to, že místo hvězdičky udáš třeba přímo ID. S hvězdičkou i obyčejný select může nabrat brutálně na čase oproti tomu, když sloupce vyjmenuješ. A samozřejmě, že na id by měl být primary key, což doufám je.

A podobnou metodikou už uděláš i druhý dotaz.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0