NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Propojení více tabulek pomocí join a výpis s odkazy

V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Lucyk
Člen
Avatar
Lucyk:24.8.2016 6:08

Ahoj, prosím o pomoc s následujícím řešením.

Mám tři tabulky:
1)TABULKA ROCNIK
ID ROCNIK - NAZEV
1 - 1994-95
2 - 1995-96
3 - 1996-97
4 - 1997-98
5 - 1998-99

2)TABULKA KATEGORIE
ID KATEGORIE - NAZEV KATEGORIE - ID ROCNIK
1 - Opavia - 1
2 - Opavia - 2
3 - Opavia - 3
4 - Orion - 3
5 - Orion - 4
6 - Orion - 5

3)TABULKA PODKATEGORIE
ID PODKATEGORIE - NAZEV PODKATEGORIE - ID KATEGORIE
1 - Tatranky - 1
2 - Piškoty - 1
3 - Věnečky - 1
4 - Piškoty - 2
5 - Tatranky - 2
6 - Tuc - 2
7 - Polomáčené - 3
8 - Deli - 4
9 - Margot - 4
10 - Kofila - 4
11 - Kaštany - 5

Z těchto tří tabulek se snažím dostat následující seznam:
1994-95 - Opavia
1995-96 - Opavia
1996-97 - Opavia
1996-97 - Orion
1997-98 - Orion

K tomu jsem použila následující část kódu:

$co="(SELECT nazev, nazev_kategorie FROM rocnik JOIN kategorie ON rocnik.id_rocnik = kategorie.id_rocnik)";

$navrat=mysql_query($co, $spojeni) or die(mysql_error());

while (list($nazev,$nazev_kategorie) = mysql_fetch_row($navrat)){
        echo ("<a href=\"list.php?$nazev&$nazev_kategorie\"><b></b>$nazev - $nazev_kategorie</a></br>");
        }

A nyní k tomuto výpisu se snažím udělat to, že když kliknu na třeba -> 1994-95 - Opavia, aby mi vyjel seznam všech "podkategorií", tzn.:
1994-95 - Opavia - Tatranky
1994-95 - Opavia - Piškoty
1994-95 - Opavia - Věnečky

Zkoušela jsem udělat něco takového:

if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])){
        // Filter the search query user input
        $nazev = $_SERVER['QUERY_STRING'];
        $nazev_kategorie = $_SERVER['QUERY_STRING'];
        $serie = str_replace(array('%20', '&'), ' ' , $_SERVER['QUERY_STRING']);

        $databaze="     ";
        $spojeni=mysql_connect("        ");

$co="(select nazev, nazev_kategorie FROM rocnik JOIN kategorie ON rocnik.id_rocnik = kategorie.id_rocnik)";

mysql_select_db("checklist-ca4035") or die( mysql_error() );
        $navrat=mysql_query($co, $spojeni) or die(mysql_error());

         echo ("<h3><center>vybral jsi --- $serie</center></h3>");
                while (list($nazev,$nazev_kategorie) = mysql_fetch_row($navrat)){
                        echo ("<a href=\"list.php?$serie\"><b></b>ODKAZ - $serie</a></br>");
                        }
        }
        else {
                echo ("<h2><span><font size=\"3\">ERR $serie</font></span></h2>");
                }

Výsledek mi vyjde tento:
vybral jsi --- 1994-95 - Opavia

a pod ním stále opakující se:
ODKAZ - 1994-95 - Opavia
ODKAZ - 1994-95 - Opavia
ODKAZ - 1994-95 - Opavia
ODKAZ - 1994-95 - Opavia
ODKAZ - 1994-95 - Opavia

Správně bych chtěla, aby to zobrazovalo:
vybral jsi --- 1994-95 - Opavia

a pod tím vyjely podkategorie:
1994-95 - Opavia - Tatranky
1994-95 - Opavia - Piškoty
1994-95 - Opavia - Věnečky

Prosím, můžete mi poradit, co mi v kódu chybí?

Děkuji

 
Odpovědět
24.8.2016 6:08
Avatar
Vít Pleskot
Člen
Avatar
Vít Pleskot:24.8.2016 7:21

Ahoj,
na prvni kouknuti bez vyzkouseni, v tom druhem dotazu se ptas na kategorie misto na podkategorie. Takze ten dotaz uprav tak aby ses ptala i na nazev podkategorie, ktery spojis s kategorii podle ID kategorie.

 
Nahoru Odpovědět
24.8.2016 7:21
Avatar
Lucyk
Člen
Avatar
Lucyk:25.8.2016 4:08

Zkušela jsem už dříve více variant a mezi nimi byla i tato:

if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])){
        // Filter the search query user input
        $nazev = $_SERVER['QUERY_STRING'];
        $nazev_kategorie = $_SERVER['QUERY_STRING'];
        $nazev_podkategorie = $_SERVER['QUERY_STRING'];
        $serie = str_replace(array('%20', '&'), ' ' , $_SERVER['QUERY_STRING']);

        $databaze="     ";
        $spojeni=mysql_connect("        ");

$co="(select nazev, nazev_kategorie, nazev_podkategorie FROM rocnik JOIN kategorie ON rocnik.id_rocnik = kategorie.id_rocnik JOIN podkategorie ON kategorie.id_kategorie = podkategorie.id_kategorie)";


mysql_select_db("checklist-ca4035") or die( mysql_error() );
        $navrat=mysql_query($co, $spojeni) or die(mysql_error());

         echo ("<h3><center>vybral jsi --- $serie</center></h3>");
                while (list($nazev,$nazev_kategorie,$nazev_podkategorie) = mysql_fetch_row($navrat)){
                        echo ("<a href=\"list.php?$serie\"><b></b>ODKAZ - $serie</a></br>");
                        }
        }
        else {
                echo ("<h2><span><font size=\"3\">ERR $serie</font></span></h2>");
                }

Výsledek je stejný jako předchozí kód:
vybral jsi --- 1994-95 - Opavia

a pod ním stále opakující se:
ODKAZ - 1994-95 - Opavia
ODKAZ - 1994-95 - Opavia
ODKAZ - 1994-95 - Opavia
ODKAZ - 1994-95 - Opavia
ODKAZ - 1994-95 - Opavia

Nejsem si jista, jestli správně dělám "query_string", když je tam více jak 2 proměnné? A v první části kódu mám pouze

echo ("<a href=\"list.php?$nazev&$nazev_kategorie\"><b></b>$nazev - $nazev_kategorie</a></br>");
 
Nahoru Odpovědět
25.8.2016 4:08
Avatar
Odpovídá na Lucyk
Michal Štěpánek:25.8.2016 7:51

Když chceš "joinovat" z více tabulek bylo by dobré uvádět v dotazu i název té tabulky, do které ten sloupec patří...

SELECT [tabulka1.sloupec1, tabulka2.sloupec1]...
Nahoru Odpovědět
25.8.2016 7:51
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Vít Pleskot
Člen
Avatar
Vít Pleskot:25.8.2016 8:14

Co se tyce dotazu do DB tak by to mohlo vypadat treba takhle takze kdyz ted koukam na tvuj prispevek tak mas zaklad dobre, ale je tam potreba doplnit jeste where podminku, kde reknes, ze chces pouze rocnik a kategorii kterou jsi predtim vybrala.
Co se tyce kodu, nejsem programator, takze ti v tom moc neporadim a necham to na jinych, ale opet na prvni kouknuti, mam dojem, ze spatne zpracovavas ten vypis, protoze v

echo ("<a href=\"list.php?$nazev&$nazev_kategorie\"><b></b>$nazev - $nazev_kategorie</a></br>");

nikde nepouzivas nazev_podkategorie, tak se ti tam logicky nemuze vypsat mas tam pouze kategorii a na zacatku odkaz, o kterem nepises ze bys ho tam primo chtela. Viz snad poradi nekdo jiny i kdyz nevim jak moc do sekce databazi zabrouzdaji ostatni.

 
Nahoru Odpovědět
25.8.2016 8:14
Avatar
Lucyk
Člen
Avatar
Lucyk:8.9.2016 4:19

Stále se mi nedaří přijít na to, co tam dělám špatně.

$co="(select nazev, nazev_kategorie, nazev_podkategorie FROM rocnik JOIN kategorie ON rocnik.id_rocnik = kategorie.id_rocnik JOIN podkategorie ON kategorie.id_kategorie = podkategorie.id_kategorie WHERE CONCAT(nazev, '-', nazev_kategorie)='$serie')";

Nebo s přidáním u selectu odkaz na tabulky

$co="(select rocnik.nazev, kategorie.nazev_kategorie, podkategorie.nazev_podkategorie FROM rocnik JOIN kategorie ON rocnik.id_rocnik = kategorie.id_rocnik JOIN podkategorie ON kategorie.id_kategorie = podkategorie.id_kategorie WHERE CONCAT(nazev, '-', nazev_kategorie)='$serie')";

Tento dotaz pro výběr je správně? Nikde jsem nenašla strukturu concatu pro více jak 2 tabulky.

A když to použiju do tohoto kodu

if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])){
        // Filter the search query user input
        $nazev = $_SERVER['QUERY_STRING'];
        $nazev_kategorie = $_SERVER['QUERY_STRING'];
        $serie = str_replace(array('%20', '&'), ' ' , $_SERVER['QUERY_STRING']);

        $databaze="     ";
        $spojeni=mysql_connect("        ");

$co="(select nazev, nazev_kategorie, nazev_podkategorie FROM rocnik JOIN kategorie ON rocnik.id_rocnik = kategorie.id_rocnik JOIN podkategorie ON kategorie.id_kategorie = podkategorie.id_kategorie WHERE CONCAT(nazev, '-', nazev_kategorie)='$serie')";


mysql_select_db("checklist-ca4035") or die( mysql_error() );
        $navrat=mysql_query($co, $spojeni) or die(mysql_error());

         echo ("<h3><center>vybral jsi --- $serie</center></h3>");
                while (list($nazev,$nazev_kategorie,$nazev_podkategorie) = mysql_fetch_row($navrat)){
                        echo ("<a href=\"list.php?$serie\"><b></b>ODKAZ - $serie</a></br>");
                        }
        }
        else {
                echo ("<h2><span><font size=\"3\">ERR $serie</font></span></h2>");
                }

Tak už mi to nic nevypisuje.

 
Nahoru Odpovědět
8.9.2016 4:19
Avatar
Vít Pleskot
Člen
Avatar
Vít Pleskot:8.9.2016 15:19

Pokud promenna $serie obsahuje spravna data, tak dotaz jako takovy takhle fungovat muze, zacal bych tedy kontrolou promenne $serie, pak bych hledal chybu v tom zpracovani dat a jejich vypisu.

 
Nahoru Odpovědět
8.9.2016 15:19
Avatar
Lucyk
Člen
Avatar
Lucyk:25.9.2016 15:46

Funguje pouze část

echo ("<h3><center>vybral jsi --- $serie</center></h3>");

ale pak tato část, co následuje za ní a měla by logicky navazovat, tak už mi to nic dalšího nevypisuje:

        while (list($nazev,$nazev_kategorie,$nazev_podkategorie) = mysql_fetch_row($navrat)){
        echo ("<a href=\"list.php?$nazev&$nazev_kategorie&$nazev_podkategorie\"><b></b>ODKAZ - $nazev - $nazev_kategorie - $nazev_podkategorie</a></br>");

                }
}

Zkončí to pouze napisem, že člověk vybral data, jaká obsahuje proměnná $serie, ale už to nevypíše např.

1994-95 - Opavia - Tatranky
1994-95 - Opavia - Piškoty
1994-95 - Opavia - Věnečky

Můžete si mi prosím někdo podívat na while cyklus? Asi bude v tom někde chyba, ale vůbec netuším kde.

 
Nahoru Odpovědět
25.9.2016 15:46
Avatar
Odpovídá na Lucyk
Michal Štěpánek:26.9.2016 10:00

nevím, ale nemělo by tady

echo ("<a href=\"list.php?$nazev&$nazev_kategorie&$nazev_podkategorie\"><b></b>ODKAZ - $nazev - $nazev_kategorie - $nazev_podkategorie</a></br>");

být třeba uvedeno o jaké proměnné se jedná?

echo ("<a href=\"list.php?nazev=$nazev&nazev_kat=$nazev_kategorie&nazev_podkat=$nazev_podkategorie\"><b></b>ODKAZ - $nazev - $nazev_kategorie - $nazev_podkategorie</a></br>");

jak v tom "list.php" rozebíráš ten řetězec proměnných, abys určila, co kde má zobrazit?

Editováno 26.9.2016 10:01
Nahoru Odpovědět
26.9.2016 10:00
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
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 9 zpráv z 9.