Avatar billede mac10 Nybegynder
25. januar 2010 - 13:46 Der er 12 kommentarer og
1 løsning

Vis produkter i kategorier og underkategorier? (svær)

Hej allesammen,

Denne her er lidt tricky fordi den virker, men er ekstrem langsom.

Jeg har følgende SQL kald:

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

$cat_id = (int) $_GET['cat_id'];

SELECT products.*, pp.img
FROM products
LEFT JOIN products_photos AS pp ON pp.product_id = products.id
LEFT JOIN products_categories AS c ON c.product_id = products.id
LEFT JOIN categories ON categories.id = c.cat_id
WHERE (c.cat_id = '$cat_id' OR categories.parent_id = '$cat_id') AND (pp.primary_img = '1' OR pp.primary_img is null)
GROUP BY products.id
ORDER BY id DESC

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

products : indeholder alle produkterne
products_photos : mellemtabel for produkternes billeder
products_categories : mellemtabel for produkternes kategorier
categories : indeholder alle kategorierne

Det ovenstående gør er at hente alle produkterne og billederne til den kategori man er inde på.
Da et produkt sagtens kun kan være tilknyttet en underkategori, og ikke hovedkategorien, så skal den vise alle produkterne fra hovedkategorien samt underkategorierne hvis man vælger en hovedkategori.

Altså kort sagt: Den viser alle produkterne som er til en hovedkategori samt alle underkategorierne hvis man vælger en hovedkategori.

Det SQL kald jeg har lavet virker, men er utrolig langsomt (selv offline).

Der hvor koden knækker er:
WHERE (c.cat_id = '$cat_id' OR categories.parent_id = '$cat_id')

Hvis jeg erstatter det med:
WHERE (c.cat_id = '$cat_id')

Så kører scriptet optimalt, men den viser så kun produkterne til den kategori man er inde på - og ikke underkategorierne hvis det er en hovedkategori.

Er der nogen der har en anden måde at formulere mit SQL kald på, da det er utrolig frustrerende at det virker så langsomt når det ellers bare kører perfekt.

På forhånd rigtig mange tak.
Avatar billede michael_stim Ekspert
25. januar 2010 - 13:51 #1
Du har sat index på de felter du søger på?
Avatar billede michael_stim Ekspert
25. januar 2010 - 13:53 #2
CREATE INDEX IDX_PARENT_ID
on categories (parent_id);
Avatar billede mac10 Nybegynder
25. januar 2010 - 14:13 #3
Nej det har jeg ikke. Skal det med i mit SQL kald eller er det noget der skal sættes én gang?
Avatar billede mac10 Nybegynder
25. januar 2010 - 14:15 #4
Fandt lige det her:

"Indexes are something extra that you can enable on your MySQL tables to increase performance,cbut they do have some downsides. When you create a new index MySQL builds a separate block of information that needs to be updated every time there are changes made to the table. This means that if you are constantly updating, inserting and removing entries in your table this could have a negative impact on performance."
http://www.tizag.com/mysqlTutorial/mysql-index.php

Og tabellen bliver konstant opdateret når der kommer nye produkter ind, er det så smart at gøre alligevel?
Avatar billede michael_stim Ekspert
25. januar 2010 - 14:19 #5
Konstant i den bemærkelse er nok lidt mere end 1 gang om måneden ;o)

Du kan bare fjerne indexet igen, hvis det ikke fungerer.

DROP INDEX IDX_PARENT_ID ON categories;
Avatar billede mac10 Nybegynder
25. januar 2010 - 14:24 #6
Havde desværre ikke den store effekt :(

Jeg tror det er mit MySQL kald som er lidt for kludret. Jeg har prøvet at lave en IF, men kan simpelthen ikke finde hoved og hale i det med IF i SQL kald.

For det er .. OR categories.parent_id = '$cat_id') som laver ballade, så det kan være der skal være en IF sætning på at den kun skal kalde på parent_id hvis den har en? eller....?
Avatar billede mac10 Nybegynder
25. januar 2010 - 16:55 #7
Okay der skulle faktisk bare index 3 forskellige steder så kørte bussen sku :)

Fik lige en kammerat til at forklare mig mere om INDEX, men du gav ligesom startskudet, tak for det. Smid et svar!
Avatar billede michael_stim Ekspert
25. januar 2010 - 17:05 #8
Ellers tak, samler ikke på point. Læg selv et svar og accepter.
Avatar billede mac10 Nybegynder
25. januar 2010 - 17:59 #9
Arh come on, det siger i allesammen sku efterhånden. Du har fortjent det fordi du hjalp og jeg gider ikk tage mine egne point så opret svar eller vi lader dette spørgsmål være åbent for jeg tager dem ikk :)
Avatar billede michael_stim Ekspert
25. januar 2010 - 18:12 #10
Jeg bliver hverken mæt eller rig af point og har mere end rigeligt. Har ikke samlet på point i mange år. Begyndte med at sige nej tak, bl a fordi der var såkaldte pointryttere der gik helt i taget hvis de følte sig snydt.
Avatar billede mac10 Nybegynder
25. januar 2010 - 18:37 #11
Jeg bliver hverken sulten eller mindre rig af at give dig pointene, så har intet imod at give dem.

Kan godt følge dig i at andre kan få ondt i røven, men i dette tilfælde har du ingen konkurrenter/pointryttere og du har en glad og tilfreds person der har fået hjælp til sit problem, som føler at du har fortjent dette under dine "besvarede spørgsmål", og pointene er så irrelevante.

Men lav venligst et svar, for det her har virkelig reddet min dag og har gjort jeg kunne fortsætte mit arbejde fremfor at sidde og glo på samme SQL sætning i timevis, så ordene til sidst så helt forkerte ud....

Kort og godt: Lav svar så bliver alle glade
Avatar billede showsource Seniormester
26. januar 2010 - 02:32 #12
Kunne man så bare bruge point til at nedsætte prisen på noget af det som idg udgiver ville man kunne blive "lidt mæt" af point :O)

Anyway, INDEX på de rigtige felter når man laver forespørgelser på flere tabeller er mega vigtigt!

Fandt jeg ud af takket være arne_v i dette spm.
http://www.eksperten.dk/spm/852973

Og det giver dig også en bedre forståelse af db opbygning fremover !

Egentlig vil jeg mene/tro at brugen af INDEX, ( "indholdsfortegnelse" ), er temmelig overset som standard.
D.v.s. mange lærer noget om db, men glemmer at få en indholdsfortegnelse med, fordi de som oftest ikke bruger mere end måske 100-200 rows i en db.

Men hvilken madopskrift-bog ( 200 retter i hver ), køber man hvis der er to forskellige:
En på 200 sider
og
en på 201 sider
hvor den sidste har en indholdsfortegnelse ?
Avatar billede mac10 Nybegynder
10. november 2010 - 12:28 #13
luk
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester