PHP -> dotaz SQL
|
18.1.2007 22:13
Silvestr Hašek
|
Dobrý den,
považuji se za celkem zkušeného programátora (PHP) amatéra a při programování jsem narazil na problém:
Mám nadefinovanou tabulku v databazi MySQL (MySQL 4.1.9) kde mam seznam registrovanych uzivatelu prirozene kazdy ma sve jedinecne identifikacni cislo (ID). V prubehu skriptu jsem si zjistil nekolik ID v presnem poradi napriklad 25;4;15;2;37. Potreboval bych vytvori SQL dotaz pro databazi který by mi vrátil radky přesne v danem poradi.
Jiste nyni to resim tak ze mam 5 nezavyslich dotazu, ale v prubehu casu s rostoucim poctem uzivatelu budu potrebovat aby se pocet zvysil. Nekolik desitek dotazu by podle me byl velky narok na server (chci ho co nejmene zatezovat) |
|
|
Re: PHP -> dotaz SQL
|
19.1.2007 04:59
Hugo
|
select ... where `ID` IN (25, 4, 15, 2, 37) |
|
|
Re: PHP -> dotaz SQL
|
19.1.2007 06:31
J.Černý
|
To nefunguje, určitě se na to nedá spolehnout (vyzkoušeno). Já to řeším přidáním sloupce, ve kterém si vedu požadované pořadí a výstup podle něj třídím. |
|
|
Re: PHP -> dotaz SQL
|
19.1.2007 08:37
Petr Zajíc
|
Totiž ... mám pocit, že stejně existuje klíč, podle kterého to řadíte, takže nestačilo by něco jako
select ... from ... where id in (1,10,25,45) order by prijmeni, jmeno? |
|
|
Re: PHP -> dotaz SQL
|
20.1.2007 05:25
dawe
|
V jakém kontextu v behu skriptu pozbíráte dané ID uzivatelu, jakoze jestli je doopravdy potreba je radit v tomhle poradi, popripade to zajistit nejak jinak, ale je potreba vedet neco okolo. |
|
|
Re: PHP -> dotaz SQL
|
20.1.2007 10:31
Silvestr Hašek
|
Jde o system hlasovani kdy kazdy uzivatel ma v tabulce bunku pro zapis koho voli. Timto dotazem si zjistim ID volenych uzivatelu a kolik maji hlasu (nazvy trosicku prepisi protoze muj spolecnik nechce aby se nejake inforamace dostaly ven):
SELECT Count(u.volim) AS hlasu, u.volim FROM uzivatele u WHERE u.ID_fora = $fora GROUP BY u.volim ORDER BY hlasu DESC
ID_fora a $fora je urceni v ktere casti webu je uzivatel registrovan. Tato informace je ulozena v SESIONS od prihlaseni.
Timto dotazem dostanu tabulku asi takhle kde hlasu je soucet hlasu ktere voleny uzivatel ma a volim je jeho ID:
hlasu volim / $no
2 23 / 1
1 9 / 2
(podsad to jde :))) Nyni si ulozim informace do pole $vyherce[$no] kde $no je cislo poradi a ted prichazi kamen urazu potrebuji zjistit prezdivku(nick) pod kterou je uzivatel registrovan opet ve stejne tabulce.
Takze ted doufam ze to pochopite a poradite nejake jednoduche reseni myslim ze nejelegantnejsi by byl jeden dotaz
SELECT nick FROM uzivatele WHERE ID IN (23,9) ORDER BY ......, nebo neco podobneho, ale jak koukam tak to asi nepujde :D |
|
|
Re: PHP -> dotaz SQL
|
20.1.2007 11:44
Petr Zajíc
|
Snažím se to pochopit, ale moc mi to nejde. Ideální by bylo někde vystavit strukturu databáze a (třeba fiktivní) data a já bych Vám s tím pomohl. Zcela určitě lze řadit spojení více tabulek podle sloupce jedné z nich, takže problém bych v tom neviděl. |
|
|
Re: PHP -> dotaz SQL
|
20.1.2007 13:15
Silvestr Hašek
|
Hmm zkusim to znova trosku jinak s tou db myslim ze to neni poreba protoze tam je sposta veci co s timto nesouvisi. Pro funkci toho skriptu je mozne pouzit 5 sloupcu ze soucasne db a to:
ID (jedinecne identifikaci cislo uzivatele)
nick (prezdivka pod kterou uzivatel vystupuje na webu)
ID_fora (rozdeluje web na casti do kterych se uzivatele registruji)
volim (uzivatel voli moderatora fora uklada se ID)
post (je-li uzivatel moderatorem, redaktorem, administratorem,...)
Přiklad tabulky:
ID / nick / ID_fora / volim
1 / adam / 1 / 1
2 / eva / 1 / 5
3 / jakub / 1 / 2
4 / jan / 1 / 2
5 / herry / 1 / 2
Toerie (podle me):
Jednoduchym formularem muze kazdy uzivatel do bunky "volim" ulozit uzivatele ktereho si preje mit jako moderatora. Ja potrebuji udelat vypis z toho hlasovani kde vysledkem bude serazeni lidi podle poctu hlasu tzn ze by tabulka vypadala asi takto:
Uzivatel / hlasu
eva / 3
adam / 1
herry / 1
Vzdy kdyz nekdo spusti skript zajistujici zmenu bunky volim tedy vlastni hlasovani tak se prepocitaji hlasy a upravi se bunka post u jednotlivich uzivatelu.
Realita:
Vsechno mi funguje tak jak ma ale mam problem s vypsanim tabulky ukazujici prubeh hlasovani. Potrebuji ji seradit podle hlasu od nejvyssiho po nejnissi.
Skript obsluhujici vypisovani tabulky (chybny):
$no = 1;
$sql_hlasovani = mysql_query("SELECT Count(u.volim) AS hlasu, u.volim FROM uzivatele u WHERE u.ID_fora = $fora GROUP BY u.volim ORDER BY hlasu DESC");
while($zaz_hlasovani = mysql_fetch_array($sql_hlasovani)){
if($zaz_hlasovani["volim"] != 0){
$id_uziv = $zaz_uziv["volim"];
$ar_hlasu[$no] = $zaz_hlasovani["hlasu"];
$ar_ID[$no] = $zaz_hlasovani["volim"];
$no++;
}
} // pocita hlasy a urcuje id k hlasum + zapis do poli
// odtud to nejde tak jak ma :)
////////////// KOTVA 1 /////////////////
$sql_najdi = "SELECT nick, ID FROM uzivatele WHERE ";
for($i = 1; $i<= 5; $i++){
if($i != 1 AND $ar_ID[$i] != ""){
$sql_najdi .= " OR ";
}
if($ar_ID[$i] != ""){
$sql_najdi .= "ID = ".$ar_ID[$i];
}
} // sql dotaz zjistujici nick uzivatele
//////////////// KOTVA 2 ///////////////////////
if($ar_nick[1] != ""){
echo "<table border='1'>";
echo "<tr>";
echo "<td>Uživatel:</td>";
echo "<td>Počet hlasů</td>";
echo "</tr>";
$i = 1;
$sql_najdi = mysql_query($sql_najdi);
while($zaz_najdi = mysql_fetch_array($sql_najdi)){
if($zaz_najdi["ID"] == $ar_ID[$i]){
echo "<tr>";
echo "<td>".$zaz_najdi["nick"]."</td>";
echo "<td>".$ar_hlasu[$i]."</td>";
echo "</tr>";
}
$i++;
}
echo "</table>";
} else {
echo "Toto forum nema vedeni<br />";
}
KOTVA 1 - dotaz $sql_najdi je spatne sestaven porteboval bych presne razeni podle ID v nasem modelovem pripade tedy 5;1;2
KOTVA 2 - moje tapani ve tme je tam podminka kterou, ani sam nevim co jsem chtel dokazat :D Jinak by to melo byt vypsani tizene tabulky :)
Jeste mam jednu otazecku jak muzu pouzit ty "Omezene HTML" znaky ve forech? Neco jsem zkousel ale nevidel jsem tozeny efekt: |
|
|
Re: PHP -> dotaz SQL
|
21.1.2007 14:18
Petr Zajíc
|
create table user (id int, nick varchar(20),id_fora int, volim int); insert into user (id, nick, id_fora, volim) values (1,'adam',1,1);
insert into user (id, nick, id_fora, volim) values (2,'eva',1,5);
insert into user (id, nick, id_fora, volim) values (3,'jakub',1,2);
insert into user (id, nick, id_fora, volim) values (4,'jan',1,2);
insert into user (id, nick, id_fora, volim) values (5,'herry',1,2);
a tabulku získáte pomocí
select volim, count(*) from user group by volim order by count(*) desc;
případě s příjmením namísto id pak třeba pomocí
select voleny.nick, count(*)
from user join user voleny on user.volim = voleny.id
group by user.volim order by count(*) desc
Jedná se skutečně o situaci, kdy můžete tabulku spojit samu se sebou a nechat všechnu špinavou práci oddřít databázi; a v PHP pak už to můžete pouze jen vypsat. Pomohlo to? |
|
|
Re: PHP -> dotaz SQL
|
21.1.2007 17:32
Silvestr Hašek
|
Dekuji moc uz to chapu uz mi to jde. Jen jsem musel ptrosicku poupravit vas dotaz na(hazelo to nejakou chybku :))) :
SELECT COUNT(user.volim) AS hlasu, voleny.nick
FROM user join user voleny on user.volim = voleny.id GROUP BY user.volim ORDER BY hlasu DESC
Nejak me nenapadlo ze by sla spojovat ta sama tabulka :D
Jeste jednou dekuji
|
|
|
|
Re: PHP -> dotaz SQL
|
21.1.2007 10:01
P.B.
|
rika vam neco JOIN a spojovani tabulek ? |
|
|
Re: PHP -> dotaz SQL
|
21.1.2007 14:20
Petr Zajíc
|
Případně poddotazy ;-) Vyřešil jsem to, viu výše. Snad mu příklad pomůže. |
|
|
|
|
KOMENTARZE
|
Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
|
|
Szukanie oprogramowania
|