Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  SQL probleem: üksteist välistavad tingimused märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
nexus4
Kreisi kasutaja
nexus4

liitunud: 01.03.2012




sõnum 15.01.2013 14:52:52 SQL probleem: üksteist välistavad tingimused vasta tsitaadiga

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 icon_eek.gif
Kommentaarid: 29 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 26
tagasi üles
vaata kasutaja infot saada privaatsõnum
mattiaza
HV kasutaja
mattiaza

liitunud: 15.07.2002




sõnum 15.01.2013 15:31:30 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
nexus4
Kreisi kasutaja
nexus4

liitunud: 01.03.2012




sõnum 15.01.2013 16:43:05 vasta tsitaadiga

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? monkey.gif
Kommentaarid: 29 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 26
tagasi üles
vaata kasutaja infot saada privaatsõnum
infidel
HV kasutaja
infidel

liitunud: 31.01.2004




sõnum 15.01.2013 16:51:19 vasta tsitaadiga

Kuna juhe oli juba eelnevalt kokku aetud, siis läksid mõtted väga kahtlastele radadele.
Tulemus siin:
sql:
  1. SELECT DISTINCT ID FROM
  2. (SELECT
  3. Sündmus, (SELECT ID FROM A WHERE A.sündmus = foo.sündmus ORDER BY Primaarsus DESC LIMIT 1)
  4. FROM
  5. (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
vaata kasutaja infot saada privaatsõnum
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 15.01.2013 16:54:32 vasta tsitaadiga

Kaks alternatiivset varianti, kuidas seda teha
ilma alampäringuta
sql:
  1.  
  2. SELECT DISTINCT coalesce(b.id,a.id) AS id,a.syndmus
  3. FROM a
  4. LEFT JOIN a AS b ON a.syndmus=b.syndmus AND b.primaarsus=1
  5.  


alampäringuga(süntaks võib olenevalt baasist pisut varieeruda)
sql:
  1.  
  2. SELECT * FROM a
  3. WHERE a.primaarsus=1 OR NOT EXISTS(SELECT id FROM a AS b WHERE a.sydnmus=b.syndmus AND b.primaarsus=1)
  4.  


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
vaata kasutaja infot saada privaatsõnum
nexus4
Kreisi kasutaja
nexus4

liitunud: 01.03.2012




sõnum 15.01.2013 16:58:54 vasta tsitaadiga

Ridu kuskil 97000+ ja järjest suureneb, endal ligipääsu muutmiseks pole...
Kommentaarid: 29 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 26
tagasi üles
vaata kasutaja infot saada privaatsõnum
andresv
HV kasutaja

liitunud: 06.12.2004



Autoriseeritud ID-kaardiga

sõnum 16.01.2013 12:30:51 vasta tsitaadiga

sql:
  1.  
  2. SELECT `Syndmus`, case when max(`Primaarsus` * ID) = 0 then id else max(`Primaarsus` * ID) end AS id FROM `TABLE` GROUP BY `Syndmus`
  3.  


tulemus:

Syndmus   id
1   11111
2   11111
3   11111
4   55555
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
nexus4
Kreisi kasutaja
nexus4

liitunud: 01.03.2012




sõnum 16.01.2013 12:39:24 vasta tsitaadiga

Sai lahendatud sellisel viisil:

sql:
  1. SELECT sündmus, id, primaarsus
  2. FROM A
  3. 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
vaata kasutaja infot saada privaatsõnum
andresv
HV kasutaja

liitunud: 06.12.2004



Autoriseeritud ID-kaardiga

sõnum 16.01.2013 12:50:03 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
nexus4
Kreisi kasutaja
nexus4

liitunud: 01.03.2012




sõnum 18.01.2013 16:43:18 vasta tsitaadiga

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 kopp.gif ,

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
vaata kasutaja infot saada privaatsõnum
andresv
HV kasutaja

liitunud: 06.12.2004



Autoriseeritud ID-kaardiga

sõnum 18.01.2013 17:02:58 vasta tsitaadiga

viimase lause peale pakuks sellist sql-i

sql:
  1.  
  2. UPDATE põhitabel p JOIN tabel t ON (p.südnmuseid = t.sündmuseid) SET p.objektiid = t.objektiid WHERE p.objektiid IS NULL
  3.  
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
m1
HV kasutaja

liitunud: 09.01.2002




sõnum 19.01.2013 11:59:45 vasta tsitaadiga

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:
  1. SELECT DISTINCT p.SündmuseID, min(t.ObjektiID) FROM
  2. põhitabel p
  3. LEFT JOIN tabel t ON p.sündmuseID=t.sündmuseID
  4. 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
vaata kasutaja infot saada privaatsõnum
nexus4
Kreisi kasutaja
nexus4

liitunud: 01.03.2012




sõnum 19.02.2013 15:24:42 vasta tsitaadiga

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:
  1. SELECT DISTINCT(sündmus), min(x), y, algus, kirjeldus
  2. FROM tabel
  3. GROUP BY sündmus, y, algus, kirjeldus


Aga ikka annab topeltread...
Kommentaarid: 29 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 26
tagasi üles
vaata kasutaja infot saada privaatsõnum
Renka
HV Guru
Renka

liitunud: 01.04.2002




sõnum 19.02.2013 15:58:12 vasta tsitaadiga

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:
  1. SELECT DISTINCT(sündmus), min(x), y, algus, kirjeldus
  2. FROM tabel
  3. GROUP BY sündmus, y, algus, kirjeldus


Aga ikka annab topeltread...



sql:
  1. SELECT sündmus, x, y, algus, kirjeldus
  2. FROM tabel
  3. GROUP BY sündmus

_________________
There is no place like 127.0.0.1
Kommentaarid: 71 loe/lisa Kasutajad arvavad:  :: 2 :: 1 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nexus4
Kreisi kasutaja
nexus4

liitunud: 01.03.2012




sõnum 19.02.2013 17:17:46 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 19.02.2013 17:19:49 vasta tsitaadiga

... 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
vaata kasutaja infot saada privaatsõnum
andresv
HV kasutaja

liitunud: 06.12.2004



Autoriseeritud ID-kaardiga

sõnum 19.02.2013 17:32:00 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  SQL probleem: üksteist välistavad tingimused
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.