Nu måste jag fråga igen..
Jag har tre orter A B C.
Jag vill plocka ut alla alternativ som A kan kopplas ihop med. Utifrån dessa vill jag ta ut alla ortar som svaret kan kopplas ihop med och uppfyller mitt vilkor.
Tex
A = Malmö.
Från malmö kan man nå stockholm och köpenhamen.
vilka av dessa orter kan man nå ort C ifrån som kan vara lule.
Så med andra ord ska jag resa från Malmö till lule fast den kombinationen kräver en ort mellan.
jättetacksam för svar
SebbeMedlem sedan jan. 20032 285 inlägg Skulle vilja veta två saker:
- Hur ser tabelluppbyggnaden ut?
- Hur ser informationen i kolumnerna ut?
det är en tabell med gilltighetstid från och till från ort avgångstid och till ort med ankomst tid.. + lite lull lull..
Men det är de jag använder..
nu kör jag
SELECT * FROM Tidtabell WHERE (Dep = 'malmö' or Arr = 'lule') AND (From <=#2003-04-17# and To >=#2003-04-17# )
vet inte om det blir så bra
Engine^Medlem sedan dec. 20003 887 inlägg Ett förslag... jag vet inte om det passar dig :)
tblOrt
-------
ID
Namn
tblDestinationer
--------------------
IDStart
IDDest
Säg att vi har dessa städer:
ID Namn
-------------------
1 Malmö
2 Stockholm
3 Köpenhamn
4 Sundsvall
5 Lule
och lite värden i tblDestinationer över vart man kan åka
IDStart IDDest
------------------
1 2
1 3
1 4
2 1
2 5
3 1
3 4
3 5
4 1
4 3
5 2
5 3
Nu så är det bara att bygga en fråga:
SELECT Namn
FROM tblOrt WHERE ID IN (SELECT IDDest FROM tblAnslutning t1
INNER JOIN tblAnslutning t2
ON t1.IDDest = t2.IDDest WHERE t1.IDStart = 1 AND t2.IDStart = 5)
Denna fråga ger dig mellanlandningen som krävs för att ta sig från Malmö till Lule (i detta fall blir svaret: Stockholm och Köpenhamn).
Jag kan tyvärr inte påverka utformningen av databasen riktigt som jag vill den importeras externt.
Men i princip så är den helt platt och ser väl ut som tblDestinationer fast de är ju inte unika kombinationerna utan
resväg 1 3 kan stå felra ggr, beroende på om vilken dag det är och om det kaske finns 2 avggr på samma dag.
gr.. jag kan inte tänka klart, så svårt ska det ju inte vara
aasahMedlem sedan mars 20034 471 inlägg För att du ska kunna få hjälp att formulera en fråga i SQL måste du tala om hur din databas ser ut. Svara på Sebbes frågor, så att vi har en chans att hjälpa dig! Alltså: Vilka tabeller har du? Exakt hur ser infon i tabellerna ut?
ok. Jag trodde jag gjorde det
jag har
From - Gilltigt från datum
To - giltig till datum
Dep - Avgångsort
Std - avgångstid
Arr - Ankomstort
Sta - Ankomst tid
så ser upplägget och det är en himla massa rader med informationen,
text
From/To/Dep/Std/Arr/Sta
2003-05-05/2003-05-28/ARN/18:30:00/HFS/19:20:00
2003-06-23/2003-06-27/HFS/09:10:00/TYF/09:25:00
2003-06-10/2003-06-19/HFS/09:10:00/TYF/09:25:00
från arn till hfs kan man åka och från hfs till tyf kan man åka..
men från arn till tyf går det inte så bra utan mellanlandning i hfs
är det ingen som kan ge tips..
Om jag utifrån en sökning plockar fram min "från ort" och alla dess möjliga "till orter" och grupperar dem och lägger den i temporär tabell..
sen så tar jag varje möjlig "till ort" och anger dem som "från ort" och med till ort det som jag önskar åka till..
låter ju omständigt..
Engine^Medlem sedan dec. 20003 887 inlägg SELECT * FROM tabell t1
INNER JOIN tabell t2
ON t2.Arr = t1.Arr
WHERE t1.Dep = '[i]från ort[/i]' AND t2.Dep = '[i]till ort[/i]'
Kan det bli rätt?
nje..
men jag tror vi är tanken på spåret.
jag får fäljande vid sökning på frånort arn
Dep Arr
ARN HFS
ARN HFS
ARN HFS
ARN HFS
ARN HFS
ARN HFS
ARN HFS
ARN HFS
ARN HFS
ARN HFS
ARN PLQ
ARN PLQ
ARN PLQ
ARN PLQ
ARN PLQ
ARN OSK
ARN OSK
ARN OSK
ARN OSK
ARN OSK
ARN HLF
ARN HLF
ARN HLF
ARN HLF
ARN HLF
ARN OSK
ARN OSK
ARN OSK
ARN OSK
ARN OSK
Så det finns 30 avgångar med 4 olika ankomstorter. De är ju de ankomstorterna jag vill åt för att se vilka av dessa som har en ankomstort enligt mitt kriterium.
LarsGMedlem sedan dec. 200012 464 inlägg Om du vill hitta alla möjliga rutter dvs, med godtyckligt antal mellanlandningar så är det inte så lätt.
Om man vill begränsa sig till högst en mellanlandning så går det hyfsat enkelt
select Std,' Direkt ',Sta
from timeTable
where now() between [FROM] and [TO]
and Dep = 'Arn'
and Arr = 'Tyf'
union
select s.std, s.arr, m.sta
from timeTable s , join timeTable m
where s.dep = 'Arn'
and s.arr = m.dep
and m.arr = 'Tyf'
and now() between s.[FROM] and s.[TO]
and now() between m.[FROM] and m.[TO]
jag är ute efter den där lösningen..
tack LarsG, men jag får fel i From instruktionen..
LarsGMedlem sedan dec. 200012 464 inlägg select Std,' Direkt ',Sta
from timeTable
where now() between [FROM] and [TO]
and Dep = 'Arn'
and Arr = 'Tyf'
union
select s.std, s.arr, m.sta
from timeTable s , timeTable m
where s.dep = 'Arn'
and s.arr = m.dep
and m.arr = 'Tyf'
and now() between s.[FROM] and s.[TO]
and now() between m.[FROM] and m.[TO]
Smög med sig ett join för mycket
Lars G.
Tack, det funkar.
vad sägs om en sån här sql?
SELECT *
FROM tidtabell
WHERE arr ="tyf" and dep IN (SELECT tidtabell.Arr FROM tidtabell GROUP BY tidtabell.Arr, tidtabell.Dep HAVING tidtabell.Dep="ARN");
LarsGMedlem sedan dec. 200012 464 inlägg Det har ingen påverkan på resultatet om du använder group by i en subselect. Group innebär bara att du tar bort duplikat men om du använder IN (subselect) så blir det sant om subselecten returnerar minst en post.
Att använda having med normala (dvs ingen aggregatfunktion) villkor är inte bra (prestandamässigt).
Så din fråga är likvärdig med
SELECT *
FROM tidtabell
WHERE arr ='tyf' and dep IN
(SELECT Arr
FROM tidtabell
where dep = 'arn' )
vilket ger samma resultat (frånsett kontroller med from/to) som den andra frågan i min union.