Autor | Zpráva | ||
---|---|---|---|
Kornout006 Profil * |
#1 · Zasláno: 23. 3. 2016, 18:37:52
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 * |
#3 · Zasláno: 23. 3. 2016, 18:55:34
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. |
||
Časová prodleva: 9 let
|
0