Avaleht
uus teema   vasta Tarkvara »  WWW »  Abi Mysql'i SELECT'iga. 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:  
raido357
HV veteran

liitunud: 26.09.2002




sõnum 29.04.2009 17:12:35 Abi Mysql'i SELECT'iga. vasta tsitaadiga

Tere!

On olemas selline tabel.

Spoiler Spoiler Spoiler


Tegu on ühe tunniplaani süsteemi osaga, selle tabeli ees märk on aine siduda kursusega/rühmadega ja osa aineid saab olema ka mitmel kursusel.

On vaja siis teha selline SELECT , et Ajaxiga saabub vormilt valitud kursuse(te) Id'd näiteks "1,2" (kursus 1 ja kursus 2) ning vaja siis küsida, et kus kursuse_id on 1 ja 2, siis anna nende kahe kursuse ühised ained. Hetkel olen proovinud nii, et "kursuse_id IN (1,2)" aga sellega ei tehta siiski vahet, kas saadud ainete_Id'd on ühised. Ei tohi tekkida olukorda, kus kursus 1'ga on seotud aine 1 ja kursus 2 aine 2, ning siis mõlemad selekteerides vormil antakse välja nii aine 1, 2, vaid peaks andma tühjuse, et sellistel kursuselt ühised ained puuduvad.

Näiteks "kursuse_id IN (1,2,3)" annak "aine_id = 7", sest 1,2,3 kõik omavad ainet id'ga 7. IN(1,3) peaks andma ainult 7, sest 3el pole aine_id'd 4.

Keeruline tekst aga küsige kui aru ei saa.

(Tabeli nime ärge pange tähele, see on vale hetkel).

Tänud!
Kommentaarid: 78 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 70
tagasi üles
vaata kasutaja infot saada privaatsõnum
Valdars
HV veteran
Valdars

liitunud: 22.02.2003




sõnum 29.04.2009 17:19:56 vasta tsitaadiga

SELECT * FROM kursus_oppejoud WHERE aine_id IN (SELECT DISTINCT aine_id FROM kursus_oppejoud WHERE kursus_id IN (kursuse ID-ed));
Kommentaarid: 47 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 44
tagasi üles
vaata kasutaja infot saada privaatsõnum
raido357
HV veteran

liitunud: 26.09.2002




sõnum 29.04.2009 17:31:37 vasta tsitaadiga

Valdars kirjutas:
SELECT * FROM kursus_oppejoud WHERE aine_id IN (SELECT DISTINCT aine_id FROM kursus_oppejoud WHERE kursus_id IN (kursuse ID-ed));


SELECT * FROM kursus_oppejoud WHERE aine_id IN (SELECT DISTINCT aine_id FROM kursus_oppejoud WHERE kursuse_id IN (1,2));
+----+---------+------------+
| id | aine_id | kursuse_id |
+----+---------+------------+
| 9 | 7 | 3 |
| 10 | 7 | 2 |
| 11 | 7 | 1 |
| 12 | 4 | 1 |
| 13 | 5 | 1 |
| 14 | 5 | 2 |
+----+---------+------------+

Tulemus pole ikka päris õige, "kursuse_id = 3" aineid ei tohiks kuvatud olla, Ainetest peaks olem kuvatud ainult 5 ja 7. Midagi sellist ->

| id | aine_id | kursuse_id |
+----+---------+------------+
| 10 | 7 | 2 |
| 11 | 7 | 1 |
| 13 | 5 | 1 |
| 14 | 5 | 2 |
+----+---------+------------+


Tulemus pole ikka päris see mida vaja

Edit:

SELECT * FROM kursus_oppejoud WHERE kursuse_id IN (1,2) AND aine_id IN (SELECT DISTINCT aine_id FROM kursus_oppejoud WHERE kursuse_id IN (1,2));

Sellega sai 7 | 3 reast lahti aga

| 12 | 4 | 1 |

veel alles.
Kommentaarid: 78 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 70
tagasi üles
vaata kasutaja infot saada privaatsõnum
tanzanite
HV kasutaja
tanzanite

liitunud: 13.05.2006




sõnum 29.04.2009 19:20:13 vasta tsitaadiga

SELECT * FROM tbl r WHERE r.kursuse_id IN (1,2) AND EXISTS (SELECT * FROM tbl a WHERE a.kursuse_id=1 AND a.aine_id=r.aine_id) AND EXISTS (SELECT * FROM tbl b WHERE b.kursuse_id=2 AND b.aine_id=r.aine_id)

... perhaps?
tagasi üles
vaata kasutaja infot saada privaatsõnum
raido357
HV veteran

liitunud: 26.09.2002




sõnum 29.04.2009 19:50:20 vasta tsitaadiga

tanzanite kirjutas:
SELECT * FROM tbl r WHERE r.kursuse_id IN (1,2) AND EXISTS (SELECT * FROM tbl a WHERE a.kursuse_id=1 AND a.aine_id=r.aine_id) AND EXISTS (SELECT * FROM tbl b WHERE b.kursuse_id=2 AND b.aine_id=r.aine_id)

... perhaps?


Tundub, et annab soovitud tulemusi, nüüd pean PHP'e poolele vajaliku funktsiooni tekitama, et vastavate väärtustega SELECT oleks.

Mis tundub, siiski veits keeruline, 1-2 rühmaga pole ullu aga näiteks oletame, et 5 või enamal rühmal on ühine aine.

Eks peab tekitama, mitme AND EXISTS'iga lause, mingise tsükli abil.

Edit: Väga hea, PHP loob SELECT lauset ja kõik toimib ideaalselt.

beer_yum.gif
Kommentaarid: 78 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 70
tagasi üles
vaata kasutaja infot saada privaatsõnum
scrag
HV kasutaja

liitunud: 08.12.2003




sõnum 29.04.2009 20:55:05 vasta tsitaadiga

Jäin vist küll hiljaks, aga huvi pärast võid katsetada, kas selline päring ka toimiks icon_smile.gif

SELECT t1.aine_id
FROM kursus_oppejoud t1, kursus_oppejoud t2
WHERE t1.kursuse_id IN (1, 2) AND t2.kursuse_id IN (1, 2) AND t1.aine_id = t2.aine_id AND t1.kursuse_id != t2.kursuse_id
Kommentaarid: 9 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 9
tagasi üles
vaata kasutaja infot saada privaatsõnum
raido357
HV veteran

liitunud: 26.09.2002




sõnum 29.04.2009 20:59:57 vasta tsitaadiga

scrag kirjutas:
Jäin vist küll hiljaks, aga huvi pärast võid katsetada, kas selline päring ka toimiks icon_smile.gif

SELECT t1.aine_id
FROM kursus_oppejoud t1, kursus_oppejoud t2
WHERE t1.kursuse_id IN (1, 2) AND t2.kursuse_id IN (1, 2) AND t1.aine_id = t2.aine_id AND t1.kursuse_id != t2.kursuse_id


See toimib ainult siis, kui on valitud kaks kursust, nagu sinu toodud lahenduses "1,2" , kui aga valitakse ainult 1 kursus, siis t1.kursus != t2.kursuse_id võrdus enam ei anna false' ja tulemus on tühi. Ei ole kas teistel viisidelgi toimib.

Praegu pool rakenduse osast valmis saanud, eelmine lahendus aitas kännust üle.

Tänud abistajatele.
Kommentaarid: 78 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 70
tagasi üles
vaata kasutaja infot saada privaatsõnum
DoS
HV veteran
DoS

liitunud: 19.08.2002




sõnum 01.05.2009 01:03:42 vasta tsitaadiga

ma pakuks omalt poolt ka veidi elegantsema lahenduse ka välja:
SELECT aine_id, COUNT(aine_id) FROM kursus_oppejoud WHERE kursuse_id IN (kursuste_id'd) GROUP BY aine_id HAVING COUNT(aine_id) = kursuste_id'de arv


Näiteks kursuste 1 ja 2 korral:
SELECT aine_id, COUNT(aine_id) FROM kursus_oppejoud WHERE kursuse_id IN (1,2) GROUP BY aine_id HAVING COUNT(aine_id) = 2

ja kursuste 1, 2 ja 3 korral
SELECT aine_id, COUNT(aine_id) FROM kursus_oppejoud WHERE kursuse_id IN (1,2,3) GROUP BY aine_id HAVING COUNT(aine_id) = 3


Töötab ka 1 korral ja ei ole vaja phps tsükleid ega muud jama.
Kui on võimalus, et tabelis on mitu korda sama aine ja kursuse kombinatsiooni, siis peaks piisama, et lõpus "=" asemele ">=" panna.
Kommentaarid: 50 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 47
tagasi üles
vaata kasutaja infot saada privaatsõnum
raido357
HV veteran

liitunud: 26.09.2002




sõnum 02.05.2009 09:43:53 vasta tsitaadiga

Kena, igati hea lahendus. thumbs_up.gif
Kommentaarid: 78 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 70
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  WWW »  Abi Mysql'i SELECT'iga.
[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.