26. september 2002 - 15:36Der er
8 kommentarer og 1 løsning
SELECT problem
Min søgning bliver genereret i en Java-applikation, som sender statementet til MySQL databasen. Søgningen er fonetisk, og gør brug af 8 tabeller. Det meste af søgningen er allerede lavet.
Den mangler at kunne hente 'Shopname', idet den finder medarbejdere der passer til søgningen. Problemet er at ikke alle medarbejdere har fået angivet et shopid, eller måske endda fået angivet et forkert shopid hvortil der ingen butik findes. Derfor skal søgningen kun hente shopnavnet, hvis der findes et shopnavn til medarbejderens shopid.
Sådan ser søgningen ud, når man søger på fornavnet Hans: -------------------------------------------------------- SELECT e.employeeid, IF(ex.beocademyno Is Not Null, ex.jobtitle, e.jobtitle) jobtitle, IF(ex.beocademyno Is Not Null, ex.firstname, e.firstname) firstname, IF(ex.beocademyno Is Not Null, ex.lastname, e.lastname) lastname, IF(ex.beocademyno Is Not Null, ex.address1, e.address1) address1, IF(ex.beocademyno Is Not Null, ex.address2, e.address2) address2, IF(ex.beocademyno Is Not Null, ex.zipcode, e.zipcode) zipcode, IF(ex.beocademyno Is Not Null, ex.city, e.city) city, IF(ex.beocademyno Is Not Null, ex.countryid, e.countryid) countryid, IF(ex.beocademyno Is Not Null, ex.phone, e.phone) phone, IF(ex.beocademyno Is Not Null, ex.mobile, e.mobile) mobile, IF(ex.beocademyno Is Not Null, ex.fax, e.fax) fax, IF(ex.beocademyno Is Not Null, ex.email, e.email) email, IF(ex.beocademyno Is Not Null, ex.birthday, e.birthday) birthday, e.hiredsince, IF(ex.beocademyno Is Not Null, ex.sex, e.sex) sex, IF(ex.beocademyno Is Not Null, ex.nativelanguage, e.nativelanguage) nativelanguage, IF(ex.beocademyno Is Not Null, ex.otherlanguage, e.otherlanguage) otherlanguage, IF(ex.beocademyno Is Not Null, ex.region, e.region) region, e.careeraspiration, e.cv, e.employeeno, e.beocademyno, IF(ex.beocademyno Is Not Null, ex.cardno, e.cardno) cardno, IF(ex.beocademyno Is Not Null, ex.cardstatus, e.cardstatus) cardstatus, IF(ex.beocademyno Is Not Null, ex.active, e.active) active, e.salesperson, e.technician, e.skillsinaudio, e.skillsinvideo, e.skillsininstallation, e.trainer, e.shopowner, e.leader, e.internalemployee, e.username, e.password, e.access, e.shopid FROM Employee e LEFT JOIN ExternEmployee ex ON e.beocademyno=ex.beocademyno WHERE ((STRCMP(SOUNDEX(e.firstname), SOUNDEX('Hans')) = 0 OR e.firstname LIKE '%Hans%') OR (STRCMP(SOUNDEX(ex.firstname), SOUNDEX('Hans')) = 0 OR ex.firstname LIKE '%Hans%')) ORDER BY e.firstname, e.lastname
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
Jeg definerer først et ekstra view for at reducere kompleksiteten i udtrykket: CREATE VIEW ExShop AS SELECT ExternShop.name, Shop.shopid FROM Shop, ExternShop WHERE Shop.shopid = ExternShop.externshopno;
Løsningen kræver en dobbelt LEFT JOIN. Jeg prøver med et ekstra view først. Hvis den løsning fungerer, kan vi samle det i et enkelt statement bagefter.
Jeg kalder din viste query for MinHans: CREATE VIEW MinHans AS SELECT ...resten af din select (Den indeholder et shopid, som er null eller invalid.)
Løsning: SELECT MinHans.jobtitle, MinHans.firstname, . . . MinHans.access, MinHans.shopid, IF(ExShop.name Is Not Null, ExShop.name, "") FROM MinHans LEFT JOIN ExShop ON MinHans.shopid = ExShop.shopid;
Har jeg forstået det korrekt, og fungerer mit eksempel med 'Hans' ?
SELECT IF(ex.beocademyno Is Not Null, ex.jobtitle, e.jobtitle) jobtitle, IF(ex.beocademyno Is Not Null, ex.firstname, e.firstname) firstname, IF(ex.beocademyno Is Not Null, ex.lastname, e.lastname) lastname, IF(ex.beocademyno Is Not Null, ex.address1, e.address1) address1, IF(ex.beocademyno Is Not Null, ex.address2, e.address2) address2, IF(ex.beocademyno Is Not Null, ex.zipcode, e.zipcode) zipcode, IF(ex.beocademyno Is Not Null, ex.city, e.city) city, IF(ex.beocademyno Is Not Null, ex.countryid, e.countryid) countryid, IF(ex.beocademyno Is Not Null, ex.phone, e.phone) phone, IF(ex.beocademyno Is Not Null, ex.mobile, e.mobile) mobile, IF(ex.beocademyno Is Not Null, ex.fax, e.fax) fax, IF(ex.beocademyno Is Not Null, ex.email, e.email) email, IF(ex.beocademyno Is Not Null, ex.birthday, e.birthday) birthday, IF(ex.beocademyno Is Not Null, ex.sex, e.sex) sex, IF(ex.beocademyno Is Not Null, ex.nativelanguage, e.nativelanguage) nativelanguage, IF(ex.beocademyno Is Not Null, ex.otherlanguage, e.otherlanguage) otherlanguage, IF(ex.beocademyno Is Not Null, ex.region, e.region) region, IF(ex.beocademyno Is Not Null, ex.cardno, e.cardno) cardno, IF(ex.beocademyno Is Not Null, ex.cardstatus, e.cardstatus) cardstatus, IF(ex.beocademyno Is Not Null, ex.active, e.active) active, e.employeeid, e.hiredsince, e.careeraspiration, e.cv, e.employeeno, e.beocademyno, e.salesperson, e.technician, e.skillsinaudio, e.skillsinvideo, e.skillsininstallation, e.trainer, e.shopowner, e.leader, e.internalemployee, e.username, e.password, e.access, e.shopid, es.name FROM ( Employee e LEFT JOIN ExternEmployee ex ON e.beocademyno=ex.beocademyno ) e1 LEFT JOIN ExternShop es ON e1.shopid=es.externshopno WHERE ((STRCMP(SOUNDEX(e.firstname), SOUNDEX('Hans')) = 0 OR e.firstname LIKE '%Hans%') OR (STRCMP(SOUNDEX(ex.firstname), SOUNDEX('Hans')) = 0 OR ex.firstname LIKE '%Hans%')) ORDER BY e.firstname, e.lastname
'e1' er alias for den første join; men jeg er usikker på hvad der sker for shopis=null. mister vi de rækker i e1?
Mit bud er vist næsten identisk med dit JacobA. Jeg startede på MySQL for to dage siden, så jeg kæmper stadig med syntaksen, som stadig er meget mangelfuld i forhold til Oracle. Jeg ville bla. have haft WHERE... med ind i parentesen, men fik ikke lov.
SELECT e.employeeid, IF(ex.beocademyno Is Not Null, ex.jobtitle, e.jobtitle) jobtitle, IF(ex.beocademyno Is Not Null, ex.firstname, e.firstname) firstname, IF(ex.beocademyno Is Not Null, ex.lastname, e.lastname) lastname, IF(ex.beocademyno Is Not Null, ex.address1, e.address1) address1, IF(ex.beocademyno Is Not Null, ex.address2, e.address2) address2, IF(ex.beocademyno Is Not Null, ex.zipcode, e.zipcode) zipcode, IF(ex.beocademyno Is Not Null, ex.city, e.city) city, IF(ex.beocademyno Is Not Null, ex.countryid, e.countryid) countryid, IF(ex.beocademyno Is Not Null, ex.phone, e.phone) phone, IF(ex.beocademyno Is Not Null, ex.mobile, e.mobile) mobile, IF(ex.beocademyno Is Not Null, ex.fax, e.fax) fax, IF(ex.beocademyno Is Not Null, ex.email, e.email) email, IF(ex.beocademyno Is Not Null, ex.birthday, e.birthday) birthday, e.hiredsince, IF(ex.beocademyno Is Not Null, ex.sex, e.sex) sex, IF(ex.beocademyno Is Not Null, ex.nativelanguage, e.nativelanguage) nativelanguage, IF(ex.beocademyno Is Not Null, ex.otherlanguage, e.otherlanguage) otherlanguage, IF(ex.beocademyno Is Not Null, ex.region, e.region) region, e.careeraspiration, e.cv, e.employeeno, e.beocademyno, IF(ex.beocademyno Is Not Null, ex.cardno, e.cardno) cardno, IF(ex.beocademyno Is Not Null, ex.cardstatus, e.cardstatus) cardstatus, IF(ex.beocademyno Is Not Null, ex.active, e.active) active, e.salesperson, e.technician, e.skillsinaudio, e.skillsinvideo, e.skillsininstallation, e.trainer, e.shopowner, e.leader, e.internalemployee, e.username, e.password, e.access, e.shopid, ExternShop.name FROM Employee e LEFT JOIN ExternEmployee ex ON e.beocademyno=ex.beocademyno LEFT JOIN Shop ON e.shopid = Shop.shopid LEFT JOIN ExternShop ON ExternShop.externshopno = Shop.externshopno WHERE ((STRCMP(SOUNDEX(e.firstname), SOUNDEX('Hans')) = 0 OR e.firstname LIKE '%Hans%') OR (STRCMP(SOUNDEX(ex.firstname), SOUNDEX('Hans')) = 0 OR ex.firstname LIKE '%Hans%')) ORDER BY e.firstname, e.lastname;
Hej Hojgaard, du kan prøve med denne... det kan være at du også forbinder employee og shop med region, men den må så bare sætte ind i JOIN ON...
SELECT e.employeeid, IF(ex.beocademyno Is Not Null, ex.jobtitle, e.jobtitle) jobtitle, IF(ex.beocademyno Is Not Null, ex.firstname, e.firstname) firstname, IF(ex.beocademyno Is Not Null, ex.lastname, e.lastname) lastname, IF(ex.beocademyno Is Not Null, ex.address1, e.address1) address1, IF(ex.beocademyno Is Not Null, ex.address2, e.address2) address2, IF(ex.beocademyno Is Not Null, ex.zipcode, e.zipcode) zipcode, IF(ex.beocademyno Is Not Null, ex.city, e.city) city, IF(ex.beocademyno Is Not Null, ex.countryid, e.countryid) countryid, IF(ex.beocademyno Is Not Null, ex.phone, e.phone) phone, IF(ex.beocademyno Is Not Null, ex.mobile, e.mobile) mobile, IF(ex.beocademyno Is Not Null, ex.fax, e.fax) fax, IF(ex.beocademyno Is Not Null, ex.email, e.email) email, IF(ex.beocademyno Is Not Null, ex.birthday, e.birthday) birthday, e.hiredsince, IF(ex.beocademyno Is Not Null, ex.sex, e.sex) sex, IF(ex.beocademyno Is Not Null, ex.nativelanguage, e.nativelanguage) nativelanguage, IF(ex.beocademyno Is Not Null, ex.otherlanguage, e.otherlanguage) otherlanguage, IF(ex.beocademyno Is Not Null, ex.region, e.region) region, e.careeraspiration, e.cv, e.employeeno, e.beocademyno, IF(ex.beocademyno Is Not Null, ex.cardno, e.cardno) cardno, IF(ex.beocademyno Is Not Null, ex.cardstatus, e.cardstatus) cardstatus, IF(ex.beocademyno Is Not Null, ex.active, e.active) active, e.salesperson, e.technician, e.skillsinaudio, e.skillsinvideo, e.skillsininstallation, e.trainer, e.shopowner, e.leader, e.internalemployee, e.username, e.password, e.access, e.shopid, s.*, es.* FROM Employee e LEFT JOIN ExternEmployee ex ON e.beocademyno=ex.beocademyno LEFT JOIN Shop s ON e.shopid=s.shopid LEFT JOIN ExternShop es ON s.exterrnshopno=es.externshopno WHERE ((STRCMP(SOUNDEX(e.firstname), SOUNDEX('Hans')) = 0 OR e.firstname LIKE '%Hans%') OR (STRCMP(SOUNDEX(ex.firstname), SOUNDEX('Hans')) = 0 OR ex.firstname LIKE '%Hans%')) ORDER BY e.firstname, e.lastname;
Dejligt.. så er der kommet en nogle løsningsforslag:
jakoba > min database har problemer med 'e1', så jeg kan ikke så den til at køre. lasse_buck > sidste forslag virkede helt som det skulle! proaccess > dit forslag var perfekt som altid :-)
Desværre vil Eksperten.dk ikke lade mig dele point'ne op mellem jer. Hvis du sender mig en mail lasse_buck, så opretter jeg et spørgsmål hvor du kan få nogle point. Min mail er dmu0006@vejlehs.dk
1000 tak for hjælpen allesammen!!!
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.