Diskuze: Začátečník - rada se sestavením dotazu

Ostatní jazyky SQL SQL a databáze Začátečník - rada se sestavením dotazu

Avatar
Jan Novák :

Ahoj všem

Potřeboval bych radu od zkušenějších. Dostal jsem za úkol vytvořit následující výstup: V databázi mám dvě tabulky - i5dof_phocadow­nload_logging (ta obsahuje seznam souboru a prehled o tom,jaké uživatelské ID stáhlo jaký soubor) a i5dof_users (ta obsahuje seznam uživatelů podle ID a uživatelského jména). Co potřebuji je když zadám jako vstup ID souboru,aby výsledek hledání byl seznam uživatelů, kteří ten soubor stáhnuli. V SQL se nevyznám, zatím se učím opravdové základy a tak složení tohoto dotazu je nad moje síly. Screeny obou tabulek jsou v příloze.
Byl by někdo ochotný poradit prosím?

 
Odpovědět 31. října 12:01
Avatar
Jan Bezdíček
Redaktor
Avatar
Jan Bezdíček:
SELECT i5dof_users.username FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.id=SEM_VLOZ_ID_SOUBORU

Neverim zadnemu dotazu, ktery napisu "na slepo" bez odzkouseni ale ... snad bude fungovat :D

Editováno 31. října 12:12
 
Nahoru Odpovědět 31. října 12:11
Avatar
Jan Bezdíček
Redaktor
Avatar
Jan Bezdíček:

Ted me jeste napadlo, ze jeden uzivatel mohl ten soubor stahnout vickrat ... v tom pripade, pokud jeho jmeno chces vratit pouze jednou a ne v zavislosti na tom, kolikrat ten soubor stahl, tak na konec muzes jeste pridat GROUP BY

SELECT i5dof_users.username FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.id=SEM_VLOZ_ID_SOUBORU GROUP BY i5dof_users.username
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 31. října 12:18
Avatar
Jan Novák :

Chlapi děkuju moc. Hned to jdu vyzkoušet a dám vědět.

 
Nahoru Odpovědět 31. října 12:20
Avatar
Jan Novák :

Tak pokud tento dotaz spustim z admina v databazi pokus je výsledek :

MySQL returned an empty result set (i.e. zero rows). ( Query took 0.0008 sec )
SELECT i5dof_users.username
FROM i5dof_users
JOIN i5dof_phocadownload_logging ON ( i5dof_users.id = i5dof_phocadownload_logging.userid )
WHERE i5dof_phocadownload_logging.id =2006
GROUP BY i5dof_users.username
LIMIT 0 , 30

Pokud tedy zadávám správně ID souboru.

 
Nahoru Odpovědět 31. října 12:28
Avatar
Jan Novák :

Tak už jsem na to přišel dotaz funguje správně, jen bylo potřeba WHERE i5dof_phocadow­nload_logging­.id zaměnit za WHERE i5dof_phocadow­nload_logging­.fileid

Děkuju moc za pomoc - záchranu života :)

 
Nahoru Odpovědět 31. října 12:32
Avatar
Jan Bezdíček
Redaktor
Avatar
Odpovídá na Jan Novák
Jan Bezdíček:

Jo tak ... myslel sem, ze id souboru je logicky jen "id" :D fileid jsem nejak prehlidl ... kazdopadne jsem rad, ze funguje :)

 
Nahoru Odpovědět  +1 31. října 12:35
Avatar
Jan Novák :

Tak ještě jeden problém - Tady je kód stránky kde to chci vypsat:

<!DOCTYPE html>
<html lang="cs-cz">

        <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
                <title>Maji stazeno</title>
        </head>

        <body>

                <h1>Maji stazeno</h1>

                <?php

$servername = "localhost";
$username = "root";
$password = "admin";

// Create connection
$conn = mysqli_connect($servername, $username, $password);

// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
$uzivatele = "SELECT i5dof_users.username FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.fileid=2006 GROUP BY i5dof_users.username LIMIT 0, 30 ";
echo('<h2>Uživatelé</h2><table border="1">');
foreach ($uzivatele as $u)
{
        echo('</td><td>' . htmlspecialchars($u['userid']));
            echo('</td><td>' . htmlspecialchars($u['username']));
        echo('</td></tr>');
}
echo('</table>');
                ?>
        </body>
</html>

A nevypíše ani čárku :/

 
Nahoru Odpovědět 31. října 12:59
Avatar
Jan Novák :

Zkusil jsem to trochu zjednodusit - tady je zdrojový kód:

<!DOCTYPE html>
<html lang="cs-cz">

        <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
                <title>Maji stazeno</title>
        </head>

        <body>

                <h1>Maji stazeno</h1>

                <?php
require_once('Db.php');
Db::connect('127.0.0.1', 'pokus', 'root', 'admin');
}
$uzivatele = Db::queryAll('SELECT i5dof_users.username FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.fileid=2006 GROUP BY i5dof_users.username');
echo('<h2>Uživatelé</h2><table border="1">');
foreach ($uzivatele as $u)
{
            echo('</td><td>' . htmlspecialchars($u['username']));
        echo('</td><td>' . htmlspecialchars($u['email']));
        echo('</td></tr>');
}
echo('</table>');
                ?>
        </body>
</html>
 
Nahoru Odpovědět 31. října 13:05
Avatar
Jan Bezdíček
Redaktor
Avatar
Odpovídá na Jan Novák
Jan Bezdíček:

Pouzivas nejaky databazovy wrapper ... nevim jak to funguje v nem, kazdopdne, snazis se vypisovat $u['email'] ale v dotazu jej neselectujes, uprav dotaz na

SELECT i5dof_users.username,i5dof_users.email FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.fileid=2006 GROUP BY i5dof_users.username

a pouziti tech <td> v tom foreach cyklu mas taky nejak zvlastne :D uzaviras TD, ktere si ani neotevrel hned na prvnim radku :D

Editováno 31. října 13:33
 
Nahoru Odpovědět 31. října 13:32
Avatar
Odpovídá na Jan Bezdíček
Jan Novák :

Takhle je to bez wrapperu a po uprave a stale nic:

<!DOCTYPE html>
<html lang="cs-cz">

        <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
                <title>Maji stazeno</title>
        </head>

        <body>

                <h1>Maji stazeno</h1>

                <?php
$myhostName="localhost";
$mydbName="pokus";
$myuserName="root";
$myPW="admin";
$connection = mysql_connect($myhostName,$myuserName,$myPW);
mysql_select_db($mydbName,$connection);
}
$uzivatele = ("SELECT i5dof_users.username,i5dof_users.email FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.fileid=2006 GROUP BY i5dof_users.username\n" . " LIMIT 0, 30 ");
echo('<h2>Uživatelé</h2><table border="1">');
foreach ($uzivatele as $u)
{
            echo('</td><td>' . htmlspecialchars($u['username']));
        echo('</td><td>' . htmlspecialchars($u['email']));
        echo('</td></tr>');
}
echo('</table>');
                ?>
        </body>
</html>

Co se týká té tabulky - ta je okopírovaná z jednoho ze zdejších tutoriálů :D

Editováno 31. října 13:43
 
Nahoru Odpovědět 31. října 13:42
Avatar
Jan Bezdíček
Redaktor
Avatar
Odpovídá na Jan Novák
Jan Bezdíček:
$uzivatele = ("SELECT i5dof_users.username,i5dof_users.email FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.fileid=2006 GROUP BY i5dof_users.username\n" . " LIMIT 0, 30 ");

Tohle neposle zadny MYSQL dotaz, jen ulozi jako string do promenne
Pouzij kod takto:

$uzivatele = mysql_query("SELECT i5dof_users.username,i5dof_users.email FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.fileid=2006 GROUP BY i5dof_users.username");

while ($u = mysql_fetch_assoc($uzivatele))
{
echo('<tr><td>' . htmlspecialchars($u['username']));
echo('</td><td>' . htmlspecialchars($u['email']));
echo('</td></tr>');
}

Kazdopadne, nepuzivej na konci dotazu klauzuli LIMIT, orezava to pocet vysledku na 30, coz urcite nechces (kdyby si ten soubor stahlo vic nez 30 lidi) a taky bys nemel pouzivat databazove funkce mysql_, je to tzv. "deprecated" a v PHP 7 uz to dokonce neni, takze by ti pod PHP 7 tenhle kod nebezel

 
Nahoru Odpovědět 31. října 13:46
Avatar
Odpovídá na Jan Bezdíček
Jan Novák :

Tak jsem kod upravil a stále nic. Dokonce mi teď načítání stránky skončí na statusu 500 a stránka se nenačte.

 
Nahoru Odpovědět 31. října 14:13
Avatar
Jan Bezdíček
Redaktor
Avatar
Odpovídá na Jan Novák
Jan Bezdíček:

Jakou mas verzi PHP ?

Koukni se do PHP error logu, najdes ho nekde ve slozce kde mas Apache/PHP

 
Nahoru Odpovědět 31. října 14:15
Avatar
Jan Novák :

PHP Version 5.5.36

K error logu se nedostanu

Editováno 31. října 14:22
 
Nahoru Odpovědět 31. října 14:21
Avatar
Jan Bezdíček
Redaktor
Avatar
Jan Bezdíček:

A kdyz das tohle na zacatek skriptu ?

error_reporting(E_ALL);
ini_set('display_errors', 1);

popripade jeste hod na pastebin.com ten tvuj aktualni kod jak ted je

 
Nahoru Odpovědět 31. října 14:29
Avatar
Odpovídá na Jan Bezdíček
Jan Novák :

Vteřinku...dostanu se k tomu tak za deset minut. Děkuji Ti že si na mne děláš čas

 
Nahoru Odpovědět 31. října 14:32
Avatar
Jan Bezdíček
Redaktor
Avatar
Odpovídá na Jan Novák
Jan Bezdíček:

Vpohode, neni zac :) rad pomuzu ... mam z toho dobrej pocit a je mi to prijemnejsi nez se nervovat nad vlastnima zdrojakama :D :D kazdopadne sem si vsiml, ze po mysql_select_db(); mas navic jednu zavorku } ... smaz ji

 
Nahoru Odpovědět 31. října 14:43
Avatar
Jan Novák :

Tak po odstranění závorky :

Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /share/MD0_DATA/Qweb/joomlaCMS/test/index.php on line 20
mp13482registrace@nova-design.czWertigonovak@nova-design.cz
 
Nahoru Odpovědět 31. října 14:53
Avatar
Jan Bezdíček
Redaktor
Avatar
Odpovídá na Jan Novák
Jan Bezdíček:

Presne co jsem rikal, mysql_ nepouzivat ... inspiruj se timhle a prepis dle toho tvuj zdrojak

http://www.w3schools.com/…ch_assoc.asp

Je tam pripojeni k DB, poslani dotazu a vypsani vysledku pomoci mysqli driveru. Ten lze pouzit.

 
Nahoru Odpovědět 31. října 14:57
Avatar
Jan Novák :

Takže verze po úpravě :

<!DOCTYPE html>
<html lang="cs-cz">

        <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
                <title>Registrace uživatele</title>
        </head>

        <body>

                <h1>Registrace uživatele</h1>

                <?php
$con=mysqli_connect("localhost","root","admin","pokus");
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }
$sql="SELECT i5dof_users.username,i5dof_users.email FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.fileid=2006 GROUP BY i5dof_users.username";
$uzivatele = mysqli_query($con,$sql);
while ($u = mysqli_fetch_assoc($uzivatele))
{
echo('<tr><td>' . htmlspecialchars($u['username']));
echo('</td><td>' . htmlspecialchars($u['email']));
echo('</td></tr>');
}
mysqli_close($con);
                ?>
        </body>
</html>

A stránka zobrazí pouze nadpis

 
Nahoru Odpovědět 31. října 15:08
Avatar
Jan Bezdíček
Redaktor
Avatar
Jan Bezdíček:
SELECT i5dof_users.username,i5dof_users.email FROM i5dof_users JOIN i5dof_phocadownload_logging ON (i5dof_users .id=i5dof_phocadownload_logging.userid) WHERE i5dof_phocadownload_logging.fileid=2006 GROUP BY i5dof_users.username

Napada me jedine, ze v tom dotazu mas mezeru ... i5dof_users .id prepis na i5dof_users.id

 
Nahoru Odpovědět  +1 31. října 15:17
Avatar
Odpovídá na Jan Bezdíček
Jan Novák :

Ano, to bylo ono :)
Teď už to vypisuje. Sice do řádku a ne do tabulky, ale s tím už si snad nějak poradím :)
Jěště jednou děkuju za ochotu, pomoc a Tvůj čas.

Díky Honza

 
Nahoru Odpovědět 31. října 15:21
Avatar
Odpovídá na Jan Novák
Michal Štěpánek:

Do řádku to vypisuje, protože tam musíš ještě před začátkem cyklu uvést tu tabulku a po skončení cyklu ji zase uzavřít...

echo('<table>');
while ($u = mysqli_fetch_assoc($uzivatele))
{
echo('<tr><td>' . htmlspecialchars($u['username']));
echo('</td><td>' . htmlspecialchars($u['email']));
echo('</td></tr>');
}
mysqli_close($con);
echo('</table>');
Nahoru Odpovědět  +1 31. října 18:58
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Jan Novák :

Díky moc. Už je to správně.

 
Nahoru Odpovědět 3. listopadu 10:32
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 25 zpráv z 25.