webForumDet fria alternativet

SQL fråga utifrån vald post

14 svar · 290 visningar · startad av KalsongCesar

KalsongCesarMedlem sedan mars 2001339 inlägg
#1

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
#2

Skulle vilja veta två saker:

  • Hur ser tabelluppbyggnaden ut?
  • Hur ser informationen i kolumnerna ut?
KalsongCesarMedlem sedan mars 2001339 inlägg
#3

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
#4

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).

KalsongCesarMedlem sedan mars 2001339 inlägg
#5

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
#6

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?

KalsongCesarMedlem sedan mars 2001339 inlägg
#7

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

KalsongCesarMedlem sedan mars 2001339 inlägg
#8

ä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
#9
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?

KalsongCesarMedlem sedan mars 2001339 inlägg
#10

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
#11

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]
KalsongCesarMedlem sedan mars 2001339 inlägg
#12

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
#13
 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

KalsongCesarMedlem sedan mars 2001339 inlägg
#14

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
#15

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.

132 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)