1 (edited by Dell 2009-07-07 03:17:22)

Topic: Irasu isrinkimas pagal 2 ir daugiau kriteriju

Sveiki,

turiu tokia uzduoti isrinkti duomenis, kurie atitinka tam tikrus kriterijus, kad lengviau butu aprasysim autobuso marsrtuto pavyzdziu.
tarkim turim DB tokius irasus:

Autobuso Nr: A11, B7, C3, D4 ir t.t.
Pradinis St:   S1,  S3,  S3, S7
Tarpinis 1:    S2,  S4,  S4, S6
Tarpinis 1:    S3,  S5,  S5, S5
Tarpinis 1:    S4,  S6, S11, S4
Tarpinis 1:    S5,  S8, S12, S3
Tarpinis 1:    S6,  S9, S13, S2
Galutinis St: S7,   S10, S14, S1

sakykim domina autobusai, kuriais galima nuvaziuoti is sustojimo S3 i sustojima S6
resultatas turetu buti: A11 ir B7
p.s. atsakymas D4 netinkama autobusas vaziuoja kita kryptim.
p.s.2 isrinkimo kriterijau pateikiami visdada tik 2.

kol kas nekyla minciu, kaip teisingai suprogramuoti visa tai :(

is anksto aciu uz sviesias mintis :)

Re: Irasu isrinkimas pagal 2 ir daugiau kriteriju

Dell wrote:

Sveiki,

turiu tokia uzduoti isrinkti duomenis, kurie atitinka tam tikrus kriterijus, kad lengviau butu aprasysim autobuso marsrtuto pavyzdziu.
tarkim turim DB tokius irasus:

Autobuso Nr: A11, B7, C3, D4 ir t.t.
Pradinis St:   S1,  S3,  S3, S7
Tarpinis 1:    S2,  S4,  S4, S6
Tarpinis 1:    S3,  S5,  S5, S5
Tarpinis 1:    S4,  S6, S11, S4
Tarpinis 1:    S5,  S8, S12, S3
Tarpinis 1:    S6,  S9, S13, S2
Galutinis St: S7,   S10, S14, S1

sakykim domina autobusai, kuriais galima nuvaziuoti is sustojimo S3 i sustojima S6
resultatas turetu buti: A11 ir B7
p.s. atsakymas D4 netinkama autobusas vaziuoja kita kryptim.
p.s.2 isrinkimo kriterijau pateikiami visdada tik 2.

kol kas nekyla minciu, kaip teisingai suprogramuoti visa tai :(

is anksto aciu uz sviesias mintis :)

Aš manyčiau, kad čia paprastas select'as: SELECT * from autobusai where stoteles=S3 and stotelės=S6

O tam kad negaudytų priešinga kryptimi važiuojančių reikia žiūrėti kokia pas tave lentelės struktūra ir galbūt rašyti sąlygą "WHERE S3<S6), arba  (jei dar to nėra) reikia į maršrutą įrašyti stotelės eilės numerį (where S3_stotelės_nr>S6_stotelės_nr)

Re: Irasu isrinkimas pagal 2 ir daugiau kriteriju

simas wrote:

Aš manyčiau, kad čia paprastas select'as: SELECT * from autobusai where stoteles=S3 and stotelės=S6

O tam kad negaudytų priešinga kryptimi važiuojančių reikia žiūrėti kokia pas tave lentelės struktūra ir galbūt rašyti sąlygą "WHERE S3<S6), arba  (jei dar to nėra) reikia į maršrutą įrašyti stotelės eilės numerį (where S3_stotelės_nr>S6_stotelės_nr)

lenteles dar neturiu, meginu kaip tik teisinga padaryti, kad kuo paprasciau ir greciau uzklausa ivykdyti.

suprantu, kad tuomet reiketu ideti dar viena stulpeli, su eiles numer
sakykim tai atrodytu mazdaug taip:

lentele: marsrutas
Auto.Nr   Prad.St|Nr   Tarp1|Nr   Tarp2|Nr   Tarp3|Nr   Tarp4|Nr   Tarp5|Nr   Galu.St|Nr
  A11         S1     1      S2     2      S3     3    S4      4     S5    5       S6    6       S7      7
  B7           S3     1      S4     2      S5     3    S6      4     S8    5       S9    6      S10     7
  C3          S3      1     S4     2      S5      3   S11     4     S12  5      S13   6       S14     7
  D4          S7      1     S6      2     S5      3    S4      4     S3    5       S2    6       S1      7

ir uzklausa atrodytu tuomet mazdaug taip?   SELECT * FROM marsrutai WHERE (stot1=S3 AND stot2=S6) AND (stot1.nr<stot2.nr)

ar teisingai. ar kaip nors protingiau galima padarti lentel ?

Re: Irasu isrinkimas pagal 2 ir daugiau kriteriju

Dell wrote:

ir uzklausa atrodytu tuomet mazdaug taip?   SELECT * FROM marsrutai WHERE (stot1=S3 AND stot2=S6) AND (stot1.nr<stot2.nr)

ar teisingai. ar kaip nors protingiau galima padarti lentel ?

Na, kažkas panašaus, tik naudoti ne stoteles o marštutus, kitas dalykas kad turėdamas tokią lentelės struktūrą turėsi tik apibrėžtą stotelių skaičių kiekvienam marštutui. mano supratimu, reikėtų daryti keletą lentelių: maršrutai, stotelės ir trečia lentelė - jų sąjunga (many to many) maršrutai-stotelės.

t.y. marsrutai
ID| Maršrutas| kita info apie mašrtutą ir t.t.
1  | A11 | žemagrindis
2  | B7| greitasis
3  | C3| paprastas

stotelės
ID | Pavadinimas      | Kita info jei reikia
1  | Autobusų parkas |
2  | Klevų                 |
3  | beržų                 |
4  | ąžuolų                |
5  | briedžių             |

ir po to jas jungiančią lentelę `marsrutu_stoteles`:
ID| Marštuto ID| stotelės ID| stotelės numeris maršrute
1|   1               | 1             | 1
2|  1                | 2             |2
3| 1                 | 5             |3
.....
ir t.t.
norėdamas išrinkti mašrutą kuris veža iš klevų į briedžių stotelę turėtum rinkti iš šios trečiosios lentelės darydamas join su pirmosiomis dviem:
select `marsrutai`.`marsrutas`, `stoteles`.`stotele` as `pradine stotele`, `stoteles`.`stotele` as `galine stotele` from `marsrutu_stoteles` left join `marsrutai` on `marstutu_stoteles`.`marsrtuto id`=`marsrutai`.`id` group by `marsruto_id` having `stoteles_id`=2 and `stoteles_id`=5

tik kol kas nežinau kaip šioje užklausoje įjungti "where `stotele2` `stotelės numeris maršrute`> `stotelė5` `stoteles numeris maršrute`. Vienas variantas - daryti tai jau pačioje programoje, apdorojant Mysql rezultatą. bet kažkaip man tai atrodo greičiau kaip hack'as, negu teisingas kelias. Tavo vietoj pamėginčiau paieškoti daugiau info MySLQ manuale - gal būtų būdas priversti tai padaryti patį Mysql serverį :)

Re: Irasu isrinkimas pagal 2 ir daugiau kriteriju

simas wrote:

tik kol kas nežinau kaip šioje užklausoje įjungti "where `stotele2` `stotelės numeris maršrute`> `stotelė5` `stoteles numeris maršrute`. Vienas variantas - daryti tai jau pačioje programoje, apdorojant Mysql rezultatą. bet kažkaip man tai atrodo greičiau kaip hack'as, negu teisingas kelias. Tavo vietoj pamėginčiau paieškoti daugiau info MySLQ manuale - gal būtų būdas priversti tai padaryti patį Mysql serverį :)

simai aciu, uzvedei ant kelio, pavyko realizuoti uzklausa, tik ji labai negrazi, tai jos cia nedesiu :) bet veikia.

aciu

Re: Irasu isrinkimas pagal 2 ir daugiau kriteriju

Dell wrote:

simai aciu, uzvedei ant kelio, pavyko realizuoti uzklausa, tik ji labai negrazi, tai jos cia nedesiu :) bet veikia.

aciu

Vis tiek būtų įdomu pamatyti galutinį variantą. įmesk, jei ten nėra paslapčių.