Autor Zpráva
MartinXYZ
Profil *
Ahoj ve spolek,

s MySQL teprve začínám, proto moc prosím někoho zdatného, kdo by mi poradil, jak na to :-).

V databázi mám několik tabulek, např. názvy: "Prvni", "Druha", "Treti", atd.
V každé tabulce mám dva sloupečky, např.: "Jmeno" a "Cislo" s vyplněnými hodnotami.

Jak docílit toho, aby se mi vypsal strom všeho v databázi, např. takto (nejlépe abecedně řazené jak názvy tabulek tak i jejich hodnoty):

Prvni
 - Aleš - 777000000
 - Boris - 777111111
 - Cyril - 777222222

Druha
 - Adam - 777000001
 - Bára - 777000002
 - Cecílie - 777000003

Treti
 - Alex - 777000011
 - Bruno - 777000022
 - Čeněk - 777000033


Doposud jsem se totiž naučil pouze vypsat hodnoty z jedné předem definované tabulky, jejíž název znám. Ale já potřebuju nějak docílit toho, aby to vypsalo opravdu všechny tabulky a jejich hodnoty z databáze.


Předem děkuji za jakékoliv rady :-)

Martin
Tori
Profil
V databázi information_schema jsou všechna metadata, názvy databází, tabulek, sloupců, dat. typy atd.
juriad
Profil
MartinXYZ:
Mimochodem, pokud jsou všechna data stejné povahy, dává smysl držet všechny informace v jediné tabulce a jen přidat jeden sloupec, který určí u každého záznamu, jakého je typu. Některé časteji řešené dotazy pro MySQL - FAQ » Nová tabulka/sloupec pro každý záznam
MartinXYZ
Profil *
juriade, díky.

Takže, jestli tomu dobře rozumím, budu mít jen jednu tabulku o třech sloupcích (např. Typ, Jméno, Číslo):


Typ --------- Jméno --------- Číslo
==========================
Práce ------- Aleš -------- 777xxxxxx
Práce ------- Boris ------- 777yyyyyy
Práce ------- Cyril -------- 777zzzzzz
Škola ------- Adam ------ 776xxxxxx
Škola ------- Bára ------- 776yyyyyy
Škola ------- Cecílie ----- 776zzzzzz

Ale nevím, jak mám udělat, aby se mi vypsal "strom" - takže nejprve získaný název "Práce" a pod ním všechny dané osoby, dále název "Škola" a pod ním zase všechny jeho osoby, atd.

Děkuji,
M.


Výsledek by tedy měl být asi takovýto:

Práce
- Aleš - 777000000
- Boris - 777111111
- Cyril - 777222222

Škola
- Adam - 777000001
- Bára - 777000002
- Cecílie - 777000003
Alphard
Profil
Viz Nejčastější potíže s PHP (FAQ) » Nadpis skupiny nejen při výpisu z databáze
Do budoucna by bylo dobré něco si přečíst o navrhování databází. Opravovat jednotlivé chyby až při konkrétních prolémech je značně neefektivní.
juriad
Profil
MartinXYZ:
Zkusím jít ještě dál:

tabulka osoby (
  id - int - primární klíč
  jmeno - varchar
)

tabulka skupiny (
  id - int - primární klíč
  název - varchar
)

tabulka osoby_ve_skupinach (
  id_osoby - int - cizí klíč
  id_skupiny - int - cizí klíč
  složený primární klíč
)

tabulka typy_kontaktů (
  id - int - primární klíč
  typ - varchar
)

tabulka kontakty (
  id - int - primární klíč
  id_osoby - int - cizí klíč
  id_typu - int - cizí klíč
  kontakt - varchar
)

S tímto schématem můžeš mít lidi v různých skupinách; jedna osoba může být i ve více.
Ke každé osobě můžeš mít libovolný počet kontaktů nejrůznějších typů - i více kontaktů stejného typu.

Takto nějak se navrhují databáze. Snažíš se, aby struktura byla co nejflexibilnější. A až potom se staráš o dotazy.
Například dotaz na seznam telefonů osob ze skupin Práce a Škola:
SELECT s.název, o.jméno, k.kontakt
FROM osoby o
JOIN osoby_ve_skupinách ovs ON o.id = ovs.id_osoby
JOIN skupiny s ON s.id = ovs.id_skupiny
JOIN kontakty k ON k.id_osoby = o.id
JOIN typy_kontaktů tk ON tk.id = k.id_typu
WHERE s.název IN ('Práce', 'Škola') AND tk.typ = 'telefon'
ORDER BY s.název, o.jméno

Ten dotaz je sice o něco delší (toto je extrém), ale umožňuje ti pokládat i dotazy typu: potřebuju telefon nebo email na Pepu, ale nevím v jaké je skupině.
Všimni si ještě, že ať už přidáš novou osobu, nový typ kontaktu, novou skupinu, tak se nikdy nezmění počet ani názvy tabulek nebo sloupců. Celá aplikace bude fungovat stále stejně, jen přibude obsah tabulek v databázi.
MartinXYZ
Profil *
Ahoj,

děkuju všem. Juriade - tohle je na mě příliš, jsem vážně úplný začátečník, takže tohle bych nezvládl :-), ale i tak díky!
Nakonec jsem to po dvou dnech nějak sesmolil podle Alpharda a jeho odkazu na "Název skupiny".

Vytvoril jsem tabulku TABULKA se sloupci TYP (obsahuje škola, práce, atd.), JMENO a CISLO... A udělal jsem tedy tento kód, který celkem funguje. Ale prosím někoho znalého, aby mi to zkontroloval, jestli jsem neudělal nějakou zásadní chybu, která by mohla způsobovat potíže... :-)

<?

$pripojit = MySQL_Connect("server", "uzivatel", "heslo") or Die(MySQL_Error());
MySQL_Select_Db("databaze") or Die(MySQL_Error());

$dotaz = "SELECT typ, jmeno, cislo FROM tabulka ORDER BY typ, jmeno"; 
$vysledek = mysql_query($dotaz); 

if(!$vysledek){ 
  echo  mysql_error() . " - " . mysql_errno(); 
} 

else{ 
  $pamet = '';
  while ($radek = mysql_fetch_assoc($vysledek)){
    if ($radek['typ'] != $pamet){
      $pamet = $radek['typ'];
      echo "<b>".$pamet."</b><br>";
    }
    echo $radek['jmeno'].", ".$radek['cislo']."<br>";
  }
}

?>

Děkuji všem,
Martin

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: