potrebuje napsat takovej dotaz..
mam 2 tabulky..
---------------------
profesori
---------------------
-id int
-name varchar
---------------------
tridy_profesori
---------------------
-teacher
-class int
no a potrebuju vypsat vsechny zaznamy z tabulky profesori ke kterym neni (prostrednictvim tabulky tridy_profesori) prirazena jedna konkretni trida trida - jeji id je v php promenne $class
(samozrejme ten vztah je n:m, takze to jsou bud profesori keri v t_p zadny zaznam nemaji nebo profesori ktery tam nejake zaznamy maji, ale zadny nema class=$class)
nenapada me nic jinyho (v MySql, v ANSI by to bylo normalne WHERE EXISTS..) nez to resit pomoci tmp tabulek a to se mi nechce..
dik za podporu :-)
SELECT pr.* FROM profesori pr left outer join tridy_profesori pr ON pr.name=tr.teacher WHERE pr.class IS NOT NULL
Že by ? Ale tak jednoduché to asi nebude, vzhledem ke kvalitě Tvých odpovědí zde ve fóru.
Nešlo by to takhle?
SELECT *
FROM profesori
WHERE id NOT IN (SELECT id_teacher FORM tridy_profesori t_p WHERE t_p.id_class=$class)
ODER BY name
Omlouvám se...přehlédl jsem pr a tr, teď by to mělo být správně
SELECT pr.* FROM profesori pr LEFT OUTER JOIN tridy_profesori tr ON pr.name=tr.teacher WHERE tr.class IS NOT NULL
2Arnie:
Počkej, moc se nevyznám v té syntaxi s JOIN, ale nedělá ten tvůj příkaz něco takového?
vyber
vsechny sloupce
z tabulek "profesori" a "tridy_profesori"
kde neni "trida" v druhe tabulce prazdna
To by potom vybralo všechny učitele, kterým je přiřazena v tabulce "tridy_profesori" neprázdná "třída". Bohdan ale chtěl, aby se mu vybrali všichni učitelé, kteří neučí určitou třídu.
Ono by to mělo udělat :
Vyber všechny sloupce z tabulky profesori, vynech přitom ty záznamy, kde name z profesori = teacher z tridy_profesori a kde ještě přitom není class nulová
a pokud chce vybrat ty, kteří tam neučí, možná jsem to špatně pochopil, tak bych to asi napsal jako :
SELECT pr.* FROM profesori pr LEFT OUTER JOIN tridy_profesori tr ON pr.name=tr.teacher WHERE tr.class='$class'
(vyber všechny záznamy z tabulky profesori, vynech přitom ty záznamy, které mají pr.name shodné s tr.teacher kde tr.class=konkretni trida)
Nemám to odzkoušené, jen vím, že v podobné syntaxi mi to spolehlivě funguje.
Mám dvě tabulky : tasting_sender a tasting_recip. Jeden člověk může být zapsán v obou tabulkách, přičemž platí, že když je tentáž člověk zapsán jako sender, automaticky pro něj platí neomezená doba aktivace konta přijímajícího. Jakmile se sender odhlásí (řádek se smaže), nebude pro něj platit neomezená doba aktivace (pokud byl zároveň registrován jako recipient)...
//vypis vsechny aktivni prijimajici
SELECT tr.* FROM tasting_recip tr left outer join tasting_sender ts ON tr.uname=ts.sname WHERE (tr.dateofreg >= DATE_SUB(CURRENT_DATE, INTERVAL $interval DAY)) OR ts.entryid IS NOT NULL OR tr.honour = 'Y' ORDER BY $razeni $jak";
Mám tam ošeřeno vícero možných varaint, které mohou nastat, ale hlavní je, že to funguje.
Já jsem ale takový ten typ, co si vytvoří určitou myšlenku a pak vrtá a přepisuje a zkouší, než se mu to povede. Alespoň tak můžu vydedukovat, jak se co chová, neboť se MySQL pořád učím.
> Já jsem ale takový ten typ, co si vytvoří určitou myšlenku a pak vrtá a přepisuje a zkouší, než se mu to povede. Alespoň tak můžu vydedukovat, jak se co chová, neboť se MySQL pořád učím.
Já taky .....
Jinak, to co jsem napsal já by ale mělo dělat totéž.
Ještě tam je ale možný zádrhel v tom, co je uloženo v tr.teacher, jestli jméno učitele, nebo id učitele, obojí shodné se záznamy z tabulky profesori. Já jsem trošku nelogicky, ale přehledněji předpokládal to jméno. Muselo by se ale ošetřit case sensitive... buďto při ukládání přes php strtolower nebo pak použít preg_match("/$name/i",$row[teacher]), takže bych k tomu mému měl ještě výhrady a přikláněl bych se spíše k využití toho id jako čísla a jeho zapisování do sloupce teacher.
No, raději toho nechám a dál se budu plácat ve svých jednoduchostech...
:) koukam ze jsem rozpoutal bourlivou diskuzi..
omlouvam se ze jsem to neupresnil, tridy_profesori.teacher~profesori.id.
to co pise pavel by melo byt ok, jenom mam pocit ze mysql tyhle vnorene selecty nepodporuje. nebo jo?!:)
jinak k te arnieho myslence:
SELECT pr.* FROM profesori pr LEFT OUTER JOIN tridy_profesori tr ON pr.id=tr.teacher WHERE tr.class<>'$class'
(to = na konci byl preklep?)
tohle je dobre, problem je v tom ze profesor muze byt zaroven ve vice tridach, takze po eft joinu ti vznikne treba:
id | name | class
1 | profesor1 | 5
1 | profesor1 | 7
1 | profesor1 | 8
2 | profesor2 | null
3 | profesor3 | 8
4 | profesor4 | 5
----
t_p.teacher se rovna id.
kdyz $class=5, tak
ten arnieho dotaz vybere 2xprofesor1, profesor2, profesor3
spravne by to ale melo byt jenom: profesor2 a 3, protoze vsichni ostatni ve tride 5 jsou..
asi to opravdu nejde jinak nez tema vnorenyma selectama, pripadne temporary table nebo - jak jsem to ze zoufalstvi napsal -
vybrat vsechny profesory
--
(select * from profesori)
a v php odfiltrovat ty, ktere jsou v
(select teacher from t_p where class='$class')
--
je to prasarna, ale uz se tim odmitam dal zabyvat :-)
jeste otazka na konec..vite teda nekdo jak je to s tema vnorenyma procedurama v MySql? dik
Tak jsem si kvůli tobě (protože mě to taky zajímá) vytvořil pokusnou databázi a zkouším ten vnořený SELECT. Bohužel to nějak nefunguje, takže MySQL to nejspíš nepodporuje :-(
@$spojeni = MySQL_Connect("localhost", "", "") or Die("Nepodařilo se připrojit k databázi!");
$db = MySQL_Select_DB("test_sql", $spojeni);
//$select = "SELECT id_ucitel FROM tridy_ucitele t_u WHERE t_u.id_trida='100000'";
$select = "SELECT *
FROM ucitele
WHERE id_ucitel NOT IN (SELECT id_ucitel FROM tridy_ucitele t_u WHERE t_u.id_trida='100000')
ORDER BY jmeno";
//$select = "SELECT *
// FROM ucitele
// WHERE id_ucitel NOT IN (SELECT id_ucitel FORM tridy_ucitele t_u WHERE t_u.id_trida='$trida')
// ODER BY jmeno";
$query = MySQL_Query($select);
include "./admin/include/hlavicka_html.php";
echo "<TABLE cellspacing=1 cellpadding=3 border=0>\n <TBODY>\n ";
echo "<TR bgcolor=#919FB7><TD colspan=2 align=center><B>Učitelé neučící 1.A<B></TD></TR>\n";
$i = 1;
while ($zaznam = MySQL_Fetch_Array($query)):
if (($i%2) == 0):
echo " <TR bgcolor=#919FB7>\n ";
else:
echo " <TR bgcolor=#B9C2D0>\n ";
endif;
echo "<TD>$zaznam[id_ucitel]</TD><TD>$zaznam[jmeno]</TD>\n ";
echo "</TR>\n";
$i++;
endwhile;
echo " </TBODY>\n</TABLE>\n";
echo "</CENTER>\n</BODY>\n\n";
Možná by pak bylo opravdu nejlepší to řešit spojením tabulek "ucitele" a "tridy_ucitele" za nějaké podmínky. Z výsledku si potom vybrat jenom ucitele.
PAVEL
no tak to jsme dosli ke stejnemu zaveru.. vzhledem k tomu ze je profesoru asi 60 a trid 19 tak to zas takovej problem neni, nicmene to ze v mysql nejdou vnoreny selecty me docela s*r*. ja chapu ze je to zadarmo :-) ale mohli by se vic snazit..
A nebo použít 2 dotazy:
$query1 = MySQL_Query(SELECT id_ucitel FROM tridy_ucitele t_u WHERE t_u.id_trida='$id_tridy');
while ($zaznam1 = MySQL_Fetch_Array($query1)):
// ziskat nějak např. řetězec 10001, 10002, 10007
// kde ta čísla jsou id nežádoucích učitelů
endwhile;
$select2 = "SELECT *
FROM ucitele
WHERE id_ucitel NOT IN ($nezadouci_ucitele)
ORDER BY jmeno";
$query2 = MySQL_Query($select2);
//Vypis.....
To už by fungovat mělo
PAVEL