Avatar billede likedon Nybegynder
03. september 2007 - 08:44 Der 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;
Avatar billede fennec Nybegynder
03. september 2007 - 09:20 #1
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;

Men er ikk esikker på den overhoved vil køre...
Avatar billede likedon Nybegynder
03. september 2007 - 10:46 #2
tro mig sql'en virker i mssql: lige nu kopier jeg tabellerne derover og opretter min nnye tabel ud fra den, som jeg så kopier tilbage til mysql.

Men her kommer forklaringen:
Funktion bruges til at lave en tabel, med varer som kunder også har købt, som har købt denne.
Fik den oprindelig lavet her:
http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/ASP/Q_20731868.html


Men hvis nogen kan komme med en tilsvarende sql/sql'er der virker i mysql så er det de samme point der er på spil.

Problemet i mysql er jeg ikke kan køre 2 select sætninger så vidt jeg ved.
Avatar billede likedon Nybegynder
03. september 2007 - 10:49 #3
>>fennec
din ser godt ud men den bliver aldrig færdig og kommer da også med en ErrorNr. 1003
Avatar billede fennec Nybegynder
03. september 2007 - 11:00 #4
Du kan godt køre 2 selects men først fra version 5.0 af mySql. Hvis der derfor kan opgradere burde den køre som du har den skrevet.
Avatar billede likedon Nybegynder
03. september 2007 - 11:13 #5
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.
Avatar billede pidgeot Nybegynder
03. september 2007 - 11:20 #6
Linux eller Windows er uden betydning (og subselects findes i øvrigt allerede i 4.1...).

Præcis hvilken fejlbesked får du fra MySQL når du forsøger at køre den?
Avatar billede fennec Nybegynder
03. september 2007 - 11:20 #7
Kan du ikke lige give et lille eks på data og data felter i din database. Jeg skal have noget at teste med for at kunne lave en som fungere.
Avatar billede likedon Nybegynder
03. september 2007 - 11:27 #8
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.
Avatar billede fennec Nybegynder
03. september 2007 - 11:55 #9
Jeg har lige lavet en test, og din oprindelige sql kører fint. Kan ses på:
http://pma.cihar.com/trunk/

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
Avatar billede likedon Nybegynder
03. september 2007 - 12:26 #10
ja det kan jeg jo se, måske kan mysql bare ikke finde ud af det når man har over 200.000 rækker
Avatar billede likedon Nybegynder
03. september 2007 - 12:27 #11
eller også er det windows vs linux versionen af mysql
Avatar billede likedon Nybegynder
03. september 2007 - 12:30 #12
jeg må finde en anden løsning. du må gerne lægge et svar jeg har rigelig med point *S*
Avatar billede likedon Nybegynder
03. september 2007 - 12:41 #13
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)
Avatar billede likedon Nybegynder
03. september 2007 - 12:51 #14
ups nær den kan godt tager bare lang tid om det:
Viser poster 0 - 29 (30 total, Forepørgsel tog 266.9606 sek)
det var ved kun 10.000 poster.  hehe

Ved at kopiere det hele over på MSSQL kan den gøre det på 1sek og det er ved 170.000 poster.
Avatar billede fennec Nybegynder
03. september 2007 - 13:09 #15
Har du lavet index's på relevante kolonner?? Det kan forminske søge tiden betydligt.

.o) <-- One Eyed Jack
Avatar billede likedon Nybegynder
03. september 2007 - 13:49 #16
hvor spadet har man lov til at være *doh*
Avatar billede kjulius Novice
03. september 2007 - 21:01 #17
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.
Avatar billede likedon Nybegynder
04. september 2007 - 09:19 #18
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.
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