Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
nexus4
Kreisi kasutaja

liitunud: 01.03.2012
|
15.01.2013 14:52:52
SQL probleem: üksteist välistavad tingimused |
|
|
Tere, olen jälle jännis.
On tabel A, tabelis on 2 veergu andmeid: ID (5kohaline kood) ja Primaarsus (väärtused 1(on primaarne) või 0(sekundaarne) )
Kui ID'd on mitu samasugust, siis ainult ühel on Primaarsus 1 ja teistel on 0.
Aga kui ID'd on ainult 1 unikaalne siis ongi see ID primaarne, aga kahjuks on Primaarsuse veergu märgitud siis kas 1 või 0.
Vaja on tabelist A võtta kõik ID'd mis on primaarsed, ehk kui mitu ID'd siis need mille Primaarsus = 1 ja kui on ainult üks ID siis tuleb see ka võtta, olenemata tema Primaarsus välja väärtusest.
Näide
ID Primaarsus
11111 1
11111 0
11111 0
11111 0
22222 0
33333 1
Ei mõtle välja seda lihtsalt
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
 |
mattiaza
HV kasutaja

liitunud: 15.07.2002
|
15.01.2013 15:31:30
|
|
|
Mulle jääb täpsemalt lugedes mulje, et kõik tabelis olevad IDd peavad olema kas ise primaarsed, või siis on täpselt sama mis mõni teine primaarne ID.
Ehk lihtne
SELECT DISTINCT id FROM a |
töötab, ja primaarsuse välja ei peagi vaatama?
|
|
Kommentaarid: 25 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
25 |
|
tagasi üles |
|
 |
nexus4
Kreisi kasutaja

liitunud: 01.03.2012
|
15.01.2013 16:43:05
|
|
|
Jah, see on lahendus sellele probleemile, mis eelnevalt kirjeldasin.
Aga see ei sobi, sest avastasin et probleemil veel mõned nüansid.
Seal tabelis A on lisaks veel veerg Sündmus(5kohaline arv) ja selle tabeli loogika on jägnev:
Sündmus toimub objektiga või objektidega, igal objektil on oma kood, see on see sama ID.
Kui nüüd toimub 7 sündmust:
Sündmus ID Primaarsus
00001 11111 1
00001 22222 0
00001 33333 0
00001 44444 0
00002 11111 1
00003 11111 0
00004 55555 1 |
Ehk siis, sündmus saab toimuda mitme objektiga (ID'ga), kui toimubki mitmega, siis ühe objekti primaarsus on 1 ja ülejäänute oma 0. Kui aga sündmus toimub ainult 1 objektiga, siis see objekt ongi primaarne, kuid Primaarsuse väärtus on pandud savilt kas siis 1 või 0.
Üritan uuesti sõnastada:
On tabel kus on Sündmus, Selle sündmusega seotud objektid, Objektide primaarsus.
Sündmusega võib olla seotud mitu objekti.
Kui sündmusega on seotud mitu objekti siis ühele nendest on määratud primaarsus = 1 teistele selle sama sündmuse objektidele primaarsus = 0
Kui sündmusega on seotud ainult 1 objekt, siis see objekti ongi primaarne objekt ja primaarsus veergu kasutada EI tohi.
Kuidas saada kätte primaarsete objektidega sündmused?
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
 |
infidel
HV kasutaja

liitunud: 31.01.2004
|
15.01.2013 16:51:19
|
|
|
Kuna juhe oli juba eelnevalt kokku aetud, siis läksid mõtted väga kahtlastele radadele.
Tulemus siin:
sql:
|
SELECT DISTINCT ID FROM (SELECT Sündmus, (SELECT ID FROM A WHERE A.sündmus = foo.sündmus ORDER BY Primaarsus DESC LIMIT 1) FROM (SELECT DISTINCT sündmus FROM A) AS foo) AS bar;
|
Kas vaja on ainult objekte või ka sündmusi?
|
|
Kommentaarid: 36 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
35 |
|
tagasi üles |
|
 |
napoleon
Unknown virus

liitunud: 08.12.2008
|
15.01.2013 16:54:32
|
|
|
Kaks alternatiivset varianti, kuidas seda teha
ilma alampäringuta
sql:
|
SELECT DISTINCT coalesce(b.id,a.id) AS id,a.syndmus FROM a LEFT JOIN a AS b ON a.syndmus=b.syndmus AND b.primaarsus=1
|
alampäringuga(süntaks võib olenevalt baasist pisut varieeruda)
sql:
|
SELECT * FROM a WHERE a.primaarsus=1 OR NOT EXISTS(SELECT id FROM a AS b WHERE a.sydnmus=b.syndmus AND b.primaarsus=1)
|
Aga asja üldisemalt vaadates teeks mina triggeri, mis hoolitseb selle eest, et vähemalt ühel real on primaarsus 1 või skripti mis andmed ära korrastab. Põhjus on selles, et ülaltoodud päringutega saab küll tulemuse, aga suurema hulga andmete puhul võib nende jõudlus kehvake olla.
|
|
Kommentaarid: 77 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
60 |
|
tagasi üles |
|
 |
nexus4
Kreisi kasutaja

liitunud: 01.03.2012
|
15.01.2013 16:58:54
|
|
|
Ridu kuskil 97000+ ja järjest suureneb, endal ligipääsu muutmiseks pole...
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
 |
andresv
HV kasutaja
liitunud: 06.12.2004
|
16.01.2013 12:30:51
|
|
|
sql:
|
SELECT `Syndmus`, case when max(`Primaarsus` * ID) = 0 then id else max(`Primaarsus` * ID) end AS id FROM `TABLE` GROUP BY `Syndmus`
|
tulemus:
Syndmus id
1 11111
2 11111
3 11111
4 55555
|
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
 |
nexus4
Kreisi kasutaja

liitunud: 01.03.2012
|
16.01.2013 12:39:24
|
|
|
Sai lahendatud sellisel viisil:
sql:
|
SELECT sündmus, id, primaarsus FROM A WHERE (primaarsus='1') OR (sündmus NOT IN(SELECT sündmus FROM A GROUP BY sündmus HAVING Count(*)>1));
|
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
 |
andresv
HV kasutaja
liitunud: 06.12.2004
|
16.01.2013 12:50:03
|
|
|
Huvi pärast uuriks, kas minu päring annab reaalsete andmete korral korrektse tulemuse ja kas päringu kiiruses ka vahet on?
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
 |
nexus4
Kreisi kasutaja

liitunud: 01.03.2012
|
18.01.2013 16:43:18
|
|
|
Ei hakka uut teemat tegema, küsimus järgmine:
kui on tabel TABEL, kus on veerud SündmuseID, ObjektiID, +n veergu erineva infoga
Tabeli täitmisloogika on selline, et on Sündmus ja selle sündmusega seotud objekt(id). Sündmusega on seotud 1 või rohkem objekti. Kui sündmusega on seotud mitu objekti, siis veerus SündmuseID on samasuguseid väärtusi mitu. Lisaks võib samade objektidega toimuda uued sündmused. iga uus sündmus saab oma ID'ks eelmineID +1 Näiteks:
SündmuseID ObjektiID
1111 0001
1111 0002
1111 0003
1112 0009
1113 0004
1114 0001 |
Kuidas saaks kätte kõik erineva SündmuseID'ga read, olenemata objektidest?
Distinct SündmuseID 'st annab kõik erinevad väärtusd SündmuseID veerust, aga oleks vaja saada kuidagi igast sündmuseID'st rida.
Kui on mitu objekti seotud ühe sündmusega, siis ei ole vahet milline obektiID kaasa võetakse. Lõpptulemus võiks antud tabeli puhul välja näha selline:
SündmuseID ObjektiID
1111 0003
1112 0009
1113 0004
1114 0001 |
Näiteks jätsin praegu objekti 0003, ei oleks vahet kas ta on 0001 või 0002 või 0003
Kas üldse on võimalik nii, ilma mingi tingimuseta selline päring?
EDIT, kuram ma seletan ikka nii keeruliselt ,
Põhimõtteliselt on nii, et ühes tabelis (Põhitabel) on Sündmused, ja teises tabelis (TABEL) on Sündmused seotud Objektidega. Nüüd mul on vaja Põhitabelisse iga sündmuse järele saada ÜKS objekt, millega ta seotud on TABEL'is, isegi kui ta seal on mitme objektida seotud, vahet ei ole milline neist.
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
 |
andresv
HV kasutaja
liitunud: 06.12.2004
|
18.01.2013 17:02:58
|
|
|
viimase lause peale pakuks sellist sql-i
sql:
|
UPDATE põhitabel p JOIN tabel t ON (p.südnmuseid = t.sündmuseid) SET p.objektiid = t.objektiid WHERE p.objektiid IS NULL
|
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
 |
m1
HV kasutaja
liitunud: 09.01.2002
|
19.01.2013 11:59:45
|
|
|
Ei saa aru kas sul on vaja põhitabelit muuta, et sinna mingi sündmuse ID salvestada või lihtsalt tahad SELECT päringut kus andmed oleks sobival kujul?
Pakun välja järgmise lihtsa lahenduse.
sql:
|
SELECT DISTINCT p.SündmuseID, min(t.ObjektiID) FROM põhitabel p LEFT JOIN tabel t ON p.sündmuseID=t.sündmuseID GROUP BY p.SündmuseID;
|
Ehk siis leiame igale sündmuseID väärtusele vastavate objektiID väärtuste hulgast väikseima. Kui objektiID ei leita, siis jääb lahter tühaks, aga SündmuseID tagastatakse ikka.
|
|
Kommentaarid: 31 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
0 :: |
30 |
|
tagasi üles |
|
 |
nexus4
Kreisi kasutaja

liitunud: 01.03.2012
|
19.02.2013 15:24:42
|
|
|
Täiesti ulme, ma olen vist jälle alguses tagasi. Vahepeal juba miskit töötas aga nüüd tabelid muutusid ja ma ei suuda uuesti neid genereerida.
Nüüd on ainult üks tabel, nimetame seda siis TABEL.
TABEL'il on veerud: SÜNDMUS, X, Y, ALGUS, KIRJELDUS.
Loogika on tabelil selline, et SÜNDMUS on seotud X ja Y koordinaatidega, mis asuvad siis X ja Y veerus.
Sündmus saab juhtuda aga mitmes kohas korraga. Ehk tabelis on ridu, kus Sündmuse väärtused on võrdsed, aga x ja y on erinevad.
Kuidas nüüd kätte saada kõik erineva sündmusega read, st. kui on sündmus mitmes kohas toimunud, siis suvaline x y paar sellest valikust. Proovisin tingimuseks võtta miinimum x väärtuse, ehk siis
sql:
|
SELECT DISTINCT(sündmus), min(x), y, algus, kirjeldus FROM tabel GROUP BY sündmus, y, algus, kirjeldus
|
Aga ikka annab topeltread...
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
 |
Renka
HV Guru

liitunud: 01.04.2002
|
19.02.2013 15:58:12
|
|
|
pedak kirjutas: |
Täiesti ulme, ma olen vist jälle alguses tagasi. Vahepeal juba miskit töötas aga nüüd tabelid muutusid ja ma ei suuda uuesti neid genereerida.
Nüüd on ainult üks tabel, nimetame seda siis TABEL.
TABEL'il on veerud: SÜNDMUS, X, Y, ALGUS, KIRJELDUS.
Loogika on tabelil selline, et SÜNDMUS on seotud X ja Y koordinaatidega, mis asuvad siis X ja Y veerus.
Sündmus saab juhtuda aga mitmes kohas korraga. Ehk tabelis on ridu, kus Sündmuse väärtused on võrdsed, aga x ja y on erinevad.
Kuidas nüüd kätte saada kõik erineva sündmusega read, st. kui on sündmus mitmes kohas toimunud, siis suvaline x y paar sellest valikust. Proovisin tingimuseks võtta miinimum x väärtuse, ehk siis
sql:
|
SELECT DISTINCT(sündmus), min(x), y, algus, kirjeldus FROM tabel GROUP BY sündmus, y, algus, kirjeldus
|
Aga ikka annab topeltread... |
sql:
|
SELECT sündmus, x, y, algus, kirjeldus FROM tabel GROUP BY sündmus
|
_________________ There is no place like 127.0.0.1 |
|
Kommentaarid: 71 loe/lisa |
Kasutajad arvavad: |
   |
:: |
2 :: |
1 :: |
61 |
|
tagasi üles |
|
 |
nexus4
Kreisi kasutaja

liitunud: 01.03.2012
|
19.02.2013 17:17:46
|
|
|
Vabandan, minu variant töötas ikka. ise sassis juba....
y tuleb ka min(y) võtta, muidu kuvab kõik... ei tea miks....
aaga see ei sobi.....
sest kui
sündmus x y
5 1 8
5 3 4
5 2 7
siis tuuakse
sündmus x y
5 1 4 mis on vale
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
 |
napoleon
Unknown virus

liitunud: 08.12.2008
|
19.02.2013 17:19:49
|
|
|
... ja saadki x ja y minimaalse väärtuse ehk oletame, et on read:
syndmus 1 x 3 y 7
sydnmus 1 x 2 y 9
tulemuseks saad
syndmys 1 x 2 y 9
... ehk need x ja y pole mitte paar vaid minimaalsed x ja y väärtused. Kui x ja y ei huvita, viska need üldse päringust välja, IMHO on sel moel võetud minimaalsed väärtused nii ehk naa täiesti kasutud.
|
|
Kommentaarid: 77 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
60 |
|
tagasi üles |
|
 |
andresv
HV kasutaja
liitunud: 06.12.2004
|
19.02.2013 17:32:00
|
|
|
nu aga võta min (x* 1000 + y) ja siis pärast saad sellest tulemusest x ja y kätte
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
 |
|