Avatar billede hojgaard Nybegynder
26. september 2002 - 15:36 Der 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



Tabellerne:
-----------
Employee:
---------
employeeid, jobtitle, firstname, lastname, address1, address2, zipcode, city, countryid, phone, mobile, fax, email, birthday, hiredsince, sex, nativelanguage, otherlanguage, region, careeraspiration, cv, employeeno, beocademyno, cardno, cardstatus, active, salesperson, technician, skillsinaudio, skillsinvideo, skillsininstallation, trainer, shopowner, leader, internalemployee, username, password, access, shopid

employeeid er primærnøgle
countryid er fremmednølge
beocademyno er fremmednølge
shopid er fremmednølge


ExternEmployee:
---------------
beocademyno, jobtitle, firstname, lastname, address1, address2, zipcode, city, country, state, cardno, cardstatus, active, phone, mobile, fax, email, birthday, sex, nativelanguage, otherlanguage, region

beocademyno er primærnøgle


Shop:
-----
shopid, shoptypeid, regionid, externshopno

shopid er primærnøgle
resten er fremmednøgler


ExternShop:
-----------
externshopno, name, address1, address2, zipcode, city, country, state, phone, mobile, fax, email, segment, region, type

externshopno er primærnøgle


Desværre kan jeg ikke indsætte et E/R-diagram er, men hvis du gerne vil se det, vil jeg meget gerne maile det.
Avatar billede disky Nybegynder
26. september 2002 - 17:08 #1
WOW en query
Avatar billede lasse_buck Nybegynder
26. september 2002 - 18:21 #2
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' ?
Avatar billede hojgaard Nybegynder
26. september 2002 - 19:44 #3
Tak for dit svar lasse_buck

Desværre er det ikke muligt at bruge din løsning, da MySQL ikke understøtter views endnu:

"It is planned to implement views in MySQL Server around version 5.0."
Avatar billede jakoba Nybegynder
27. september 2002 - 02:34 #4
som her:


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?

mvh JakobA
Avatar billede lasse_buck Nybegynder
27. september 2002 - 03:03 #5
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;
Avatar billede jakoba Nybegynder
27. september 2002 - 03:10 #6
men du har  Shop-databasen  med, den missede jeg totalt :(
Avatar billede lasse_buck Nybegynder
27. september 2002 - 03:15 #7
Klokken er også mange ;o)
Avatar billede proaccess Nybegynder
27. september 2002 - 07:41 #8
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;
Avatar billede hojgaard Nybegynder
27. september 2002 - 11:15 #9
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!!!
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