29. januar 2004 - 17:15Der er
13 kommentarer og 1 løsning
Select med join virker ikke
Hej
Hjææælp :-D
Oprindeligt havde jeg to select-sætninger, starten med følende, som finder de aktuelle artikler/links:
strSQL="select * FROM LINKS_FSH WHERE Email_sent = 'false' and Publish between '" & alternativeDate2(date()-4) & "' and '" & alternativeDate() & "' AND TYPE <> 'CHAT'" set rs1 = dataConn.execute(strSQL)
Når de disse artikler er fundet, så skal email-adresserne på de folk, som har skrevet de disse artikler, findes:
do while not rs1.BOF or not rs1.EOF strSQL="select * FROM FORUM_MEMBERS WHERE MEMBER_ID = " & rs1("MemberID") set rs2 = dataConn.execute(strSQL)
Og det virker fint, men jeg vil gerne have kørt dem sammen i en sætning, så jeg prøvede:
strSQL="SELECT FORUM_MEMBERS.Member_ID, FORUM_MEMBERS.M_EMAIL, FORUM_MEMBERS.M_FIRSTNAME, FORUM_MEMBERS.M_LASTNAME, FSH_LINKS.TITLE, FSH_LINKS.TYPE left join FORUM_MEMBERS.Member_ID = LINKS_FSH.MemberID WHERE LINKS_FSH.Email_sent = 'false' and LINKS_FSH.Publish between '" & alternativeDate2(date()-4) & "' and '" & alternativeDate() & "' AND LINKS_FSH.TYPE <> 'CHAT'"
Men den brokker sig over den måde jeg joiner på.... og det kan jeg da slet ikke forstå, så go jeg er til sql ;-)
I et inbound callcenter, hvor identiteten på den, der ringer ind, skal bekræftes, kan kontrollen nu foregå i telefonkøen. Det understøtter fem centrale KPI'er for callcentre.
SELECT FORUM_MEMBERS.Member_ID , FORUM_MEMBERS.M_EMAIL , FORUM_MEMBERS.M_FIRSTNAME , FORUM_MEMBERS.M_LASTNAME , LINKS_FSH.TITLE , LINKS_FSH.TYPE FROM FORUM_MEMBERS left join LINKS_FSH ON FORUM_MEMBERS.Member_ID = LINKS_FSH.MemberID WHERE LINKS_FSH.Email_sent = 'false' AND LINKS_FSH.Publish between '2004-01-25' AND '2004-01-29' AND LINKS_FSH.TYPE <> 'CHAT'
Det virker faktisk nu, men den er utrolig langsom (100 gange langsommere end det oprindeligt script, som ses helt i toppen af mit indlæg).
>har du mange rækker 1500 i FORUM_MEMBERS og 5000 i FSH_LINKS
>har du index på Member_ID datatypen på både ID i både LINKS_FSH og FORUM_MEMBERS PRIMARY og INDEX
>member_id findes i begge tabeller Måske kan fejlen ligger i, at artikler (LINKS_FSH) ikke nødvendigvis har tilknyttet en forfatter (FORUM_MEMBERS), fordi man godt kan have lov til at være anonym.
CREATE TABLE LINKS_FSH ( ID int(11) NOT NULL auto_increment, MemberID int(11) NOT NULL default '0', CategoryID int(11) NOT NULL default '0', Email_sent text NOT NULL, Email_to text, Url text NOT NULL, Title text NOT NULL, Picture text NOT NULL, Description text NOT NULL, Type text NOT NULL, Language text NOT NULL, Publish date NOT NULL default '0000-00-00', Created date NOT NULL default '0000-00-00', FSH text NOT NULL, PRIMARY KEY (ID), KEY ID (ID) ) TYPE=MyISAM;
OUTPUT: SELECT FORUM_MEMBERS.Member_ID , FORUM_MEMBERS.M_EMAIL , FORUM_MEMBERS.M_FIRSTNAME , FORUM_MEMBERS.M_LASTNAME , LINKS_FSH.ID , LINKS_FSH.TITLE , LINKS_FSH.TYPE , LINKS_FSH.Email_to FROM FORUM_MEMBERS left join LINKS_FSH ON FORUM_MEMBERS.Member_ID = LINKS_FSH.MemberID WHERE LINKS_FSH.Email_sent = 'false' AND LINKS_FSH.Publish between '2004-01-25' AND '2004-01-29' AND LINKS_FSH.TYPE <> 'CHAT'
prøv at bytte om på FORUM_MEMBERS og LINKS_FSH i din from/left join
ala
FROM LINKS_FSH left join FORUM_MEMBERS on LINKS_FSH.MemberID = FORUM_MEMBERS.Member_ID
Normalt vil man vende left join således at du først skrive 'grundtabellen' og efter left join den tabel du vil berige den første den første med. Eller blander jeg left og right join sammen ?
Hvis du vil have 10 points ekstra, så må du gerne hjælpe mig følgende:
Jeg bruger en hjemme-lavet funktion til at omsætte en dansk dato til en amerikansk dato, men det ville jo gå mere hurtigere, hvis der lå en sådan i MySql.... så kender du sådan en?
...LINKS_FSH.Publish between '" & alternativeDate2(date()-4) & "'...
jeg går udfra at publish er af type date i din tabel fremfor timestamp, men jeg har desværre ikke en nem løsning, du vil kunne finde mange høker løsninger i både PHP og ASP kategorierne.
Du skal nok lede efter noget ala
SELECT UNIX_TIMESTAMP(timestamp_felt) AS date FROM tabel SELECT DATE_FORMAT( tid, '%d/%m %Y %H:%i') AS dato
if intMonth < 10 then intMonth = "0"&intMonth end if if intDay < 10 then intDay = "0"&intDay end if if intHour < 10 then intHour = "0"&intHour end if if intMinute < 10 then intMinute = "0"&intMinute end if if intSecond < 10 then intSecond = "0"&intSecond end if
strOut = intYear & intMonth & intDay & intHour & intMinute & intSecond MySQLDateTime = strOut End Function
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.