Datuve :: Forums :: Arhīvs :: sql vaicājums!

Datuve

Mana Datuve

Reģistrācija | Noteikumi | Paroles atjaunošana



Forums

Ieskaties


Raksti

Lietotāji online

Lietotāji online: 73

Reģistrētie lietotāji online: 0

Viesi online: 73

Datuve.lv video
Top.LV

sql vaicājums!

Ievietoja: parkets @ 2009.06.12 11:19  

Sveicināti!
Lūdzu jūsu palīdzību vienā jautājumā.
Man ir divas tabulas iekš datubāzes -
users:
http://yourdesign.lv/tabulas/1.jpg
friends
http://yourdesign.lv/tabulas/2.JPG
es vēlos noskaidrot "draugus online". es esmu user piem. ar id = 3
lai noskaidrotu savu draugu id, lietoju:

SELECT users.id, friends.kursh, friends.kuru
FROM users
INNER JOIN friends
ON friends.kuru = users.id
AND users.id = 3
OR friends.kursh = users.id
AND users.id = 3
..un sanāk:
http://yourdesign.lv/tabulas/3.jpg
.. viss bumbās.
BET vēlos SELECT tikai tos friends, kuri ir online, tb users.online> time()-15*60
kāds izskatītos sql vaicājums? es te gruzos, man izmet tos, kas online, bet viņus atkārto kādas 50 reizes.. tas man nav vajadzīgs. Kāds var palīdzēt?

Komentāri:

#1 ob1 @ 2009.06.12 11:31

SELECT users.id, friends.kursh, friends.kuru
FROM users
INNER JOIN friends
ON friends.kuru = users.id

Where

users.id = 3
OR friends.kursh = users.id
AND users.id = 3

Kaut kā tā? ON ir domāts tabulu "salinkošanai". Filtrēšanai parasti izmanto WHERE.

#2 parkets @ 2009.06.12 11:47

nujā, es ar to JOIN sapinos, nezināju viņa nozīmi īsti.
ob1, tu nesaprati, un nav brīnums, ko es vēlos, jo uzrakstīju tā, ka saprotu tikai es :D
p.s. beidzot atrisināju šito murgu ar:
SELECT users.id, friends.kursh, friends.kuru
FROM users, friends
WHERE users.online> 1244710000
AND users.id = friends.kuru
AND friends.kursh = 3
OR
users.online> 1244710000
AND users.id = friends.kursh
AND friends.kuru = 3

#3 sn1per @ 2009.06.12 11:59

pirmkārt, tavos where nosacījumos divas reizes parādās viens un tas pats, pareizāk būtu rakstīt

WHERE
 users.online> 1244710000 and
 ((users.id = friends.kuru and friends.kursh = 3) or (users.id = friends.kursh and friends.kuru = 3))

otrkārt, tas nebūs gana optimāli, jo tad tev primārais index būs uz online laiku, labāk tomēr būtu uz ID.

es taisītu tā, ka atlasītu no friends tabulas visus ierakstus, kur figurē id 3 un piejoinotu klāt users tabulu ar laiku, kad viņi pēdējo reizi bij online un pēc vajadzības tad tam joinam pieliktu where online > <kautkāds_laiks>

atlasīt tos drauga_id var teiksim ar
select
 case
   when friends.kuru = 3 then friends.kursh
   else friends.kuru
 end as drauga_id
from
 friends
where
 friends.kuru = 3 or friends.kursh = 3

edit - tas varētu izskatīties šādi, bet strādātu atkarībā no sql db, citās var joinot pie paša veidota mainīgā, citās nevar, tad var taisīt vnk subeslectu vai nedaudz savādākus where nosacījumus

select
case
  when friends.kuru = 3 then friends.kursh
  else friends.kuru
end as drauga_id
from
friends
left join users on drauga_id = users.id
where
(friends.kuru = 3 or friends.kursh = 3)
and users.online > time()-15*60

#4 parkets @ 2009.06.12 12:11

jā, optimālāk ir vispirms atlasīt draugus, tq..

bet man vajag zināt nevis kad viņi pēdējo reizi bij online, bet gan vai viņi TAGAD ir online. man sesija beidzas pēc 15min  = 60*15, tātad draugs ir sistēmā, ja online(tas skaitlis)>time()-60*15

edit: rezultatā izmet: (manā nevar joinot pie pašveidota mainīga acīmredzot)
#1054 - Unknown column 'drauga_id' in 'on clause'