03. september 2007 - 08:44Der er
17 kommentarer og 1 løsning
Oversæt fra MSSQL til MySQL
Er der nogen der kan oversætte den til at virke i MySQl
SELECT m.ordreindhold_vareid ,count(m.ordreindhold_vareid) as popularity FROM moviezoo_site_ordreindhold_arkiv m where m.ordreindhold_vareid <> '4550' and m.ordreindhold_ordreid in (Select n.ordreindhold_ordreid from moviezoo_site_ordreindhold_arkiv n where n.ordreindhold_vareid='4550') group by m.ordreindhold_vareid order by popularity desc;
Jeg kan overhoved ikke gennemskue hvad det er du har gang i der. Du selecter alt fra orderinhold hvor vareID <> 4550 hvorefter du vil have alle dem hvor vareID = 4550.
Kan du ikke lige forklare din DB opbygning og hvad du prøver på??
Mit bedste bud indtil vidre er: SELECT m.ordreindhold_vareid, count(m.ordreindhold_vareid) as popularity FROM moviezoo_site_ordreindhold_arkiv m inner join moviezoo_site_ordreindhold_arkiv n on n.ordreindhold_ordreid = m.ordreindhold_ordreid where m.ordreindhold_vareid <> '4550' and n.ordreindhold_vareid='4550' group by m.ordreindhold_vareid order by popularity desc;
har prøvet i 5.0.41 og 5.1 uden held, det skal dog siges at det er på windows. jeg har ikke et webhotel med 5.0 på linux tilrådighed for at se om den vil virke der.
det eneste jeg bruger i forespørgelsen er vareID, ordreID.
det er bare et ordrearkiv med ordrelinier hver ordrelinie har et ordreID og et vareID
jeg vil så gerne have foreslået hvilke varer jeg skal købe i forhold til den jeg er inde og kikke på.
I mit eksempel: jeg kigger på vareID=4550
så kigger jeg i mit ordrearkiv efter ordreID'er der har købt den. Så vil jeg have af vide hvilke andre vare har de købt samtidig, selvfølgelig i en pioriteret rækkefølge.
Det er phpMyAdmin's demo. Login er root og ingen password. Databasen er Fennec.
Jeg har kørt denne sql:
SELECT vareid ,count(vareid) as popularity FROM `Ordre` where vareid <> 3 and ordreid in (Select ordreid from `Ordre` where vareid=3) group by vareid order by popularity desc
jeg kopierede 10.000 række op på serveren, og så går den i stå. Så tror ikke MySQL håndtere forespørgelsen på samme måde som MSSQL. Jeg kommer nok til at lave kørslen over flere forespørgelser så. Det var så en ting MSSQL kan gøre som MySQl ikke kan o)
Jeg ved godt, at spørgsmålet er besvaret, så det er mere for at tilfredsstille min egen nysgerrighed, men for mig at se, så er der ikke noget i den givne SQL, som MySQL ikke skulle kunne finde ud af. Eneste variabel er for mig at se, om MySQL pre 4.1 kan håndtere en subselect i IN konstruktionen. Hvis du har en gammel version af MySQL, kan det måske være nødvendigt at omskrive forespørgslen til en join-konstruktion i stedet. Det kunne f.eks. være noget lign. dette:
SELECT m.ordreindhold_vareid ,COUNT(m.ordreindhold_vareid) AS popularity FROM moviezoo_site_ordreindhold_arkiv m, moviezoo_site_ordreindhold_arkiv n WHERE m.ordreindhold_vareid <> '4550' AND n.ordreindhold_vareid='4550' AND m.ordreindhold_ordreid = n.ordreindhold_ordreid GROUP BY m.ordreindhold_vareid ORDER BY popularity desc;
eller i en anden, mere nutidig form:
SELECT m.ordreindhold_vareid ,COUNT(m.ordreindhold_vareid) AS popularity FROM moviezoo_site_ordreindhold_arkiv m INNER JOIN moviezoo_site_ordreindhold_arkiv n ON m.ordreindhold_ordreid = n.ordreindhold_ordreid WHERE m.ordreindhold_vareid <> '4550' AND n.ordreindhold_vareid='4550' GROUP BY m.ordreindhold_vareid ORDER BY by popularity desc;
Under alle omstændigheder er det normalt hurtigere at lave det som en join, især hvis de rigtige indexer er på plads.
Efter jeg satte index'er på, var hastigheden ikke noget problem længere. Men der opstod så selvfølgelig et andet:
Funktionen skulle bruges til at køre alle vare igennem (16.000stk) og oprette en ny tabel med anbefalede varenumre til dem alle.
Da jeg gjorde det på live databasen, som sitet kører på (en mySQL) gik scriptet hele tiden i stå, uden nogen synlig grund.
Resultatet blev at jeg indtil videre har oprettet et job i MSSQL, der kopiere ordretabellinierne derover og laver forespørgslen der, samtidig med at den skriver resultatet tilbage til mySQL'en, hvor det skal bruges.
Bøvlet ja, men det virker, og så skal jeg i gang med noget andet.
Synes godt om
Ny brugerNybegynder
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.