/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Flere grå hår dag for dag... ?
Fra : EnjoyNews


Dato : 28-02-07 02:25

Mine grå hår er ved at skifte farve endnu engang over noget jeg bare ikke
kan få til at virke


Jeg har en kunde table med et kunde id og kundens info.
Derudover har jeg 2 forskellige tables med nogle filtre som kunden har sat.

KFilterLokation:
-KundeID
-LokationFilterID

KFilterType:
-KundeID
-TypeFilterID

Ex.
KFilterLokation:
-KundeID 2 -LokationFilterID 1
-KundeID 2 -LokationFilterID 2

KFilterType:
-KundeID 2 -TypeFilterID 4
-KundeID 2 -TypeFilterID 5

Altså hvor kunde 2 har valgt lokation 1 og 2 samt type 4 og 5

Dette virker fint, og jeg kan kalde frem hvilke valg kunden har valgt i de
to forskellige filtre Lokation og Type.


MEN....

Jeg har så også et firma table som er magen til.
Altså
FFilterLokation:
-FirmaID
-LokationFilterID

FFilterType:
-FirmaID
-TypeFilterID

Som indeholder de valg nogle firmaer har lavet.


Nu vil jeg så prøve at finde de firmaer der matcher ex. kunde 2 men det kan
jeg simpelthen bare ikke få til at virke.

Jeg kan godt matche de 2 lokations filtre sådan her:
SELECT * FROM KFilterLokation kfl LEFT JOIN FFilterLokation ffl ON
(kfl.LokationFilterID = ffl.LokationFilterID)
Dette finder de firmaer der har satte et eller flere krydser magen til
kunden.

Dette kan jeg selvfølgelig også med Type filtret...
Men... Det jeg gerne vil er at finde dem der matcher begge filtre med en
eller flere match fra både Lokation og Type.



Altså... når nu kunde 2 har valgt lokation 1 og 2 samt type 4 og 5
skal den finde alle de firmaer der har valgt enten lokation 1 eller 2 eller
begge dele... men samtidig også har valgt Type 4 eller 5 eller begge dele.

Det er så her jeg har brugt flere dage og ikke rigtig kommet videre



Kan nogle komme med et bud... ?


På forhånd tak..
Michael













 
 
Jens Gyldenkærne Cla~ (28-02-2007)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 28-02-07 11:33

EnjoyNews skrev:

> Jeg har så også et firma table som er magen til.

Har du overvejet at have firmaer og kunder samme sted? (evt. med et
felt til at angive om de er firmaer, kunder eller måske begge dele)

Tabeller der er helt eller næsten ens, kan være tegn på uheldigt
design.

> Jeg kan godt matche de 2 lokations filtre sådan her:
> SELECT * FROM KFilterLokation kfl LEFT JOIN FFilterLokation
> ffl ON (kfl.LokationFilterID = ffl.LokationFilterID)

Hvorfor bruger du LEFT i stedet for INNER join? Du er vel kun
interesseret i par der passer.

> Dette kan jeg selvfølgelig også med Type filtret...
> Men... Det jeg gerne vil er at finde dem der matcher begge
> filtre med en eller flere match fra både Lokation og Type.

Et skud fra hoften:

SELECT *
FROM KFilterLokation kfl INNER JOIN FFilterLokation ffl
ON kfl.LokationFilterID = ffl.LokationFilterID
INNER JOIN KFilterType kft ON kfl.firmaID = kft.firmaID
INNER JOIN FFilterType fft ON ktf.TypeFilterID = fft.TypeFilterID


Pointen er at lave et join mellem dine to filter-joins - baseret på
firmaID som bindeleddet.

I praksis vil et join til firma- og kundetabellerne nok også skulle
lægges på - og evt. med en DISTINCT eller GROUP BY til at fjerne
overflødige informationer.

NB: Hvilken database benytter du?
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

EnjoyNews (01-03-2007)
Kommentar
Fra : EnjoyNews


Dato : 01-03-07 02:13


"Jens Gyldenkærne Clausen" <jens@gyros.invalid> skrev i en meddelelse
news:Xns98E575729C2EAjcdmfdk@gyrosmod.cybercity.dk...
> EnjoyNews skrev:
>
>> Jeg har så også et firma table som er magen til.
>
> Har du overvejet at have firmaer og kunder samme sted? (evt. med et
> felt til at angive om de er firmaer, kunder eller måske begge dele)
>
> Tabeller der er helt eller næsten ens, kan være tegn på uheldigt
> design.

Er de så ikke sværere at sammenligne hvis de ligger i samme table ??


>
>> Jeg kan godt matche de 2 lokations filtre sådan her:
>> SELECT * FROM KFilterLokation kfl LEFT JOIN FFilterLokation
>> ffl ON (kfl.LokationFilterID = ffl.LokationFilterID)
>
> Hvorfor bruger du LEFT i stedet for INNER join? Du er vel kun
> interesseret i par der passer.

Ja det er en fejl.. Der skulle have stået INNER JOIN


>
>> Dette kan jeg selvfølgelig også med Type filtret...
>> Men... Det jeg gerne vil er at finde dem der matcher begge
>> filtre med en eller flere match fra både Lokation og Type.
>
> Et skud fra hoften:
>
> SELECT *
> FROM KFilterLokation kfl INNER JOIN FFilterLokation ffl
> ON kfl.LokationFilterID = ffl.LokationFilterID
> INNER JOIN KFilterType kft ON kfl.firmaID = kft.firmaID
> INNER JOIN FFilterType fft ON ktf.TypeFilterID = fft.TypeFilterID
>
>
> Pointen er at lave et join mellem dine to filter-joins - baseret på
> firmaID som bindeleddet.

Det virker ikke helt... Den lægger lokationerne sammen som den skal, og
laver man så et INNER JOIN til type tablen virker det også, og det er kun
kundes type valg der vises.
Men laver man så det sidste INNER JOIN for at sammenligne med det andet type
filter tilføjer den nogle der passer type mæssigt sammen men ikke passer
lokations mæssigt..
Og det er lige netop det jeg bare ikke på nogen måde kan få den til at lave
anderledes...

Jeg har også prøvet at lave ét table med både kundes lokation og type valg
og ligeledes ét table til firmaets lokation og type valg... Men dem kan jeg
heller ikke få til at sætte sig rigtigt sammen...


Jeg har lavet en meget simpel table med 2 kunder der har valgt:
Lokation 1 og type 4,5
Lokation 1,2 og type 4

Og så en simpel firma table med 3 firmaer der har valgt:
Lokation 1 og type 4,5
Lokation 1,2 og type 4
Lokation 2 og type 5

Ingen af de to kunder burde blive paret med firma 3 da kunde 1 ikke matcher
på lokation og kunde 2 ikke passer med type...
Men ligemeget hvad jeg gør, så er firma 3 at finde i listen når man får
join'et alle 4 tables (kunde lokation, firma lokation, kunde type og firma
type)


Det er så her mine grå hår ikke rigtig vil forsvinde, og det er bare så
irreterende at går rundt med sådan et problem i hovedet hele dagen lang



>
> I praksis vil et join til firma- og kundetabellerne nok også skulle
> lægges på - og evt. med en DISTINCT eller GROUP BY til at fjerne
> overflødige informationer.

Ja det er klart... jeg skal bare lige have det til at virke først..


>
> NB: Hvilken database benytter du?

Det er en MySQL database.



Jens Gyldenkærne Cla~ (01-03-2007)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 01-03-07 11:51

EnjoyNews skrev:

> Er de så ikke sværere at sammenligne hvis de ligger i samme
> table ??

Nej da - du kan sagtens anvende en tabel flere gange i en
forespørgsel (alias).


>> SELECT *
>> FROM KFilterLokation kfl INNER JOIN FFilterLokation ffl
>> ON kfl.LokationFilterID = ffl.LokationFilterID
>> INNER JOIN KFilterType kft ON kfl.firmaID = kft.firmaID
>> INNER JOIN FFilterType fft ON ktf.TypeFilterID =
>> fft.TypeFilterID

> Det virker ikke helt... Den lægger lokationerne sammen som den
> skal, og laver man så et INNER JOIN til type tablen virker det
> også, og det er kun kundes type valg der vises.
> Men laver man så det sidste INNER JOIN for at sammenligne med
> det andet type filter tilføjer den nogle der passer type
> mæssigt sammen men ikke passer lokations mæssigt..

Hm - det burde den ikke.

Men vi kan prøve at nærme os fra en anden vinkel.
Hvis du siger at det virker hvis du kun sammenligner på ét af
kriterierne (type eller lokation), må du kunne lave en forespørgsel
for hver af disse:

SELECT firmaID, kundeID
FROM (forespørgsel der finder matchende lokationer)

SELECT firmaID, kundeID
FROM (forespørgsel der finder matchende typer)

Disse to forespørgsler kan forbindes med et join, hvorved du finder
dem der opfylder begge kriterier. Joinkriteriet er et match på både
firmaID og kundeID (det er måske derfor mit første forslag
fejlede).

Hvis din database understøtter views, kan du gemme
indgangsforespørgslerne som views - så bliver det lidt lettere at
overskue. Men i praksis kan det godt laves uden.

--
Jens Gyldenkærne Clausen
»Diplomatiet består netop i, at de gamle kommatister kan få lov til
at tro, at de har vundet. Men i virkeligheden har de tabt.«
Ole Togeby i Information

EnjoyNews (01-03-2007)
Kommentar
Fra : EnjoyNews


Dato : 01-03-07 22:37


"Jens Gyldenkærne Clausen" <jens@gyros.invalid> skrev i en meddelelse
news:Xns98E6789822ACAjcdmfdk@gyrosmod.dtext.news.tele.dk...
> EnjoyNews skrev:
>
>> Er de så ikke sværere at sammenligne hvis de ligger i samme
>> table ??
>
> Nej da - du kan sagtens anvende en tabel flere gange i en
> forespørgsel (alias).

Det er rigtigt ja.. Det kan jeg lige kigge på..
Ligenu skal jeg bare lige have det til at virke


>
>
>>> SELECT *
>>> FROM KFilterLokation kfl INNER JOIN FFilterLokation ffl
>>> ON kfl.LokationFilterID = ffl.LokationFilterID
>>> INNER JOIN KFilterType kft ON kfl.firmaID = kft.firmaID
>>> INNER JOIN FFilterType fft ON ktf.TypeFilterID =
>>> fft.TypeFilterID
>
>> Det virker ikke helt... Den lægger lokationerne sammen som den
>> skal, og laver man så et INNER JOIN til type tablen virker det
>> også, og det er kun kundes type valg der vises.
>> Men laver man så det sidste INNER JOIN for at sammenligne med
>> det andet type filter tilføjer den nogle der passer type
>> mæssigt sammen men ikke passer lokations mæssigt..
>
> Hm - det burde den ikke.
>
> Men vi kan prøve at nærme os fra en anden vinkel.
> Hvis du siger at det virker hvis du kun sammenligner på ét af
> kriterierne (type eller lokation), må du kunne lave en forespørgsel
> for hver af disse:
>
> SELECT firmaID, kundeID
> FROM (forespørgsel der finder matchende lokationer)

SELECT * FROM KFilterLokation kfl INNER JOIN FFilterLokation ffl ON
(kfl.LokationFilterID=ffl.LokationFilterID)
Det virker og finder helt præcist dem der passer på lokation som den skal..


>
> SELECT firmaID, kundeID
> FROM (forespørgsel der finder matchende typer)

SELECT * FROM KFilterType kft INNER JOIN FFilterType fft ON
(kft.TypeFilterID=fft.TypeFilterID)
Det virker og finder helt præcist dem der passer på type som den skal..


>
> Disse to forespørgsler kan forbindes med et join, hvorved du finder
> dem der opfylder begge kriterier. Joinkriteriet er et match på både
> firmaID og kundeID (det er måske derfor mit første forslag
> fejlede).

Så er det nok her jeg står af...
For hvordan de to forespørgelser ?
Der mangler jo et bindeled af en slags ?


>
> Hvis din database understøtter views, kan du gemme
> indgangsforespørgslerne som views - så bliver det lidt lettere at
> overskue. Men i praksis kan det godt laves uden.

Det er jeg ikke helt klar over... Normalt kan jeg logge ind på min webserver
og bruge phpMyAdmin, men linket virker ikke lige i øjeblikket af en eller
anden grund. Det er eller Wannafind som ellers plejer at have styr på det.
Så jeg sidde med en Test.php fil og retter i den, uploader den, og kalder
den frem i min browser... Lidt besværlig vej



Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409073
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste