LINUXSOFT.cz
Nazwa użytkownika: Hasło:     
    CZ UK PL

> Komentarze :: Poradna PHP -> dotaz SQL

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 21:43
Petr Zajíc
Ujišťuju, že půjde i ten první dotaz, zkoušel jsem ho. Minimálně na verzi 5 MySQL. O spojování tabulky se sebou sama píšeme třeba tady: http://www.linuxsoft.cz/article.php?id_article=906
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
PHP -&gt; dotaz SQL 18.1.2007 22:13 Silvestr Hašek
  |- Re: PHP -&gt; dotaz SQL 19.1.2007 04:59 Hugo
  | L Re: PHP -&gt; dotaz SQL 19.1.2007 06:31 J.Černý
  |- Re: PHP -&gt; dotaz SQL 19.1.2007 08:37 Petr Zajíc
  L Re: PHP -&gt; dotaz SQL 20.1.2007 05:25 dawe
    L Re: PHP -&gt; dotaz SQL 20.1.2007 10:31 Silvestr Hašek
      |- Re: PHP -&gt; dotaz SQL 20.1.2007 11:44 Petr Zajíc
      | L Re: PHP -&gt; dotaz SQL 20.1.2007 13:15 Silvestr Hašek
      |   L Re: PHP -&gt; dotaz SQL 21.1.2007 14:18 Petr Zajíc
      |     L Re: PHP -&gt; dotaz SQL 21.1.2007 17:32 Silvestr Hašek
      |       L Re: PHP -&gt; dotaz SQL 21.1.2007 21:43 Petr Zajíc
      L Re: PHP -&gt; dotaz SQL 21.1.2007 10:01 P.B.
        L Re: PHP -&gt; dotaz SQL 21.1.2007 14:20 Petr Zajíc
Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
> Szukanie oprogramowania
1. Pacman linux
Download: 4888x
2. FreeBSD
Download: 9077x
3. PCLinuxOS-2010
Download: 8573x
4. alcolix
Download: 10961x
5. Onebase Linux
Download: 9668x
6. Novell Linux Desktop
Download: 0x
7. KateOS
Download: 6254x

1. xinetd
Download: 2425x
2. RDGS
Download: 937x
3. spkg
Download: 4777x
4. LinPacker
Download: 9981x
5. VFU File Manager
Download: 3205x
6. LeftHand Mała Księgowość
Download: 7210x
7. MISU pyFotoResize
Download: 2819x
8. Lefthand CRM
Download: 3570x
9. MetadataExtractor
Download: 0x
10. RCP100
Download: 3133x
11. Predaj softveru
Download: 0x
12. MSH Free Autoresponder
Download: 0x
©Pavel Kysilka - 2003-2024 | mailatlinuxsoft.cz | Design: www.megadesign.cz