Autor Zpráva
Petr2
Profil *
Dobrý večer,
řeším jednu situaci.

Mám dvě tabulky.
1. board kde je strukturá následovná:
ID - Název - ID kategorie #1 - ID kategorie #2
1--- test---- 2 ---------------------- 3 ----------------

2. boardcategory, struktura:
ID - Název
2--- První název kategorie
3 -- Druhý název kategorie

Potřebuji tedy spojit tabulky (ID v boardu s názvem kategorie boardcategory).

Mám tedy sql:

$query = mysql_query("
SELECT a.title AS a_title, b.title AS b_title, a.*
FROM board a LEFT JOIN boardcategory  b ON (a.category1 = b.id)  ORDER BY id DESC");

while ($item = mysql_fetch_row($query)) {
    $return.= "<tr>
    <td>".$item["a_title"]."</td>
    <td>".$item["b_title"]."</td>

</tr>";
}

b_title se vypíše bez problému, ale a_title ne. Alias zde mam.

Chybu nikde nevidím :(.
Díky
Alphard
Profil
Nejrychlejší bude spustit ten dotaz v nějakém adminu a podívat se, jak je ten sloupec pojmenovaný, jeslti není prázdný apod.
jdanek
Profil
Musíš si v SELECTu vytáhnout i sloupce z boardcategory      b.* nebo alespoň b.id

$query = mysql_query("
SELECT a.title AS a_title, b.title AS b_title, a.*, b.*
FROM board a
LEFT JOIN boardcategory b ON (b.id = a.category1)  ORDER BY a.id DESC");
 
while ($item = mysql_fetch_row($query)) {
    $return.= "<tr>
    <td>".$item["a_title"]."</td>
    <td>".$item["b_title"]."</td>
 
</tr>";
}
Petr2
Profil *
Abych se přiznal, tal ten SQL blbne.

Napíšu zde raději celý kód:

/* --- Definice tabulky --- */
$output.="<p><a href='index.php?p=board&add'><img src='images/icons/new.png' alt='' class='icon' /> Vytvořit nový záznam</a></p>
<table class='list'>
<form action='' method='post' name='delete' enctype='multipart/form-data'>
<thead>
<tr>
    <td>#</td>
    <td>Datum</td>
    <td>Přidáno</td>
    <td>Sejmuto</td>
    <td>Název dokumentu</td>
    <td>Kategorie č. 1</td>
    <td>Kategorie č. 2</td>
    <td>Soubor</td>
    <td>Autor</td>
    <td>Úprava</td>
    <td><img src='images/icons/note.png' alt='note'class='icon' /></td>
</tr>
</thead>
<tbody>";

/* --- SQL  --- */
$query = DB::query("
SELECT a.title AS a_title, b.title AS b_title, a.*, b.*
FROM `" . _mysql_prefix . "-board` a
LEFT JOIN  `" . _mysql_prefix . "-board-category`
b ON (a.category1 = b.id AND a.category2 = b.id) 
ORDER BY a.id DESC
 " . $paging[1]);
 
 // Někde v $query blbne kód.

echo mysql_error();

while ($item = DB::row($query)) {

// Ceck title_a cat #1
    if ($item["a_title"] = "") {
        $cat_a = "Nevybrána žádná kategorie";
    } else {
        $cat_a = $item["a_title"];
    }
// Ceck title_a cat #2
    if ($item["b_title"] = "") {
        $cat_b = "Nevybrána žádná kategorie";
    } else {
        $cat_b = $item["b_title"];
    }

// Ceck files
    $ext = substr($item['file'], 15, 18);
    if (in_array($ext, array("rar", "zip", "tar", "gz", "tgz", "7z", "cab", "xar", "xla", "777", "alz", "arc", "arj", "bz", "bz2", "bza", "bzip2", "dz", "gza", "gzip", "lzma", "lzs", "lzo", "s7z", "taz", "tbz", "tz", "tzip"))) {
        $icon = "archive";
    } elseif (in_array($ext, array("jpg", "jpeg", "png", "gif", "bmp", "jp2", "tga", "pcx", "tif", "ppf", "pct", "pic", "ai", "ico"))) {
        $icon = "image";
        $image = true;
    } elseif (in_array($ext, array("sql", "php", "php3", "php4", "php5", "phtml", "py", "asp", "cgi", "shtml", "htaccess", "txt", "nfo", "rtf", "html", "htm", "xhtml", "css", "js", "ini", "bat", "inf", "me", "inc", "xml"))) {
        $icon = "editable";
    } elseif (in_array($ext, array("wav", "mp3", "mid", "rmi", "wma", "mpeg", "mpg", "wmv", "3gp", "mp4", "m4a", "xac", "aif", "au", "avi", "voc", "snd", "vox", "ogg", "flac", "mov", "aac", "vob", "amr", "asf", "rm", "ra", "ac3", "swf", "flv"))) {
        $icon = "media";
    } elseif (in_array($ext, array("exe", "com", "bat", "dll"))) {
        $icon = "executable";
    } elseif (in_array($ext, array("sld", "slp", "sle"))) {
        $icon = "sl";
    } else {
        $icon = "other";
    }


// table
    $output.= "<tr>
    <td>" . $item["id"] . "</td> - Zde se vrátí ID z sunlight-board-category místo sunlight-board
    <td>" . _formatTime($item["time"]) . "</td>
    <td><span style='color: green'>" . date('d.m.Y', strtotime($item["start"])) . "</span></td>
    <td><span style='color: red'>" . date('d.m.Y', strtotime($item["down"])) . "</span></td>
    <td>" . $item["title"] . "</td> - Zde se výpíše title z  sunlight-board-category místo sunlight-board
    <td>" . $item["a_title"] . "</td> - Zde se nevýpíše nic, ale potřeboval bych title z sunlight-board-category (podle ID)
    <td>" . $item["b_title"] . "</td> - Zde se nevýpíše nic, ale potřeboval bych title z sunlight-board-category (podle ID)
    <td><img src='images/icons/fman/" . $icon . ".png' alt='file' class='icon' />[ <a href='" . $cesta . "/" . $item["file"] . "'>Zobrazit</a> ]</td>
    <td>" . _linkUser($item['author'], 0, 1, 1) . "</td>
    <td align='right'><a href='index.php?p=board&amp;edit=" . $item["id"] . "'><img src='images/icons/edit.png' alt='' class='icon' /> Upravit</a></td>
    <td align='right'><label><input type='checkbox' name='pole[]' value='" . $item["file"] . "' /> Ke smazání</label></td>
</tr>";
}

/* --- pagging  --- */
$output.=" <tr><td colspan=11><div style='float: left'>" . $paging[0] . "</div><div style='float: right'><img src='images/icons/note.png' alt='note'class='icon' /><strong class='text-red'>POZOR!</strong> Data budou nenávratně smazána!!! <input type='submit' name='delete' value='Smazat'  onclick='return _sysConfirm();' /></div></td></tr>
</tbody></table></form>";

Zde je náčrt tabulek http://upload.smetka.net/files/as_left_join.png . Nevím kde by mohl být zakopán čokl :-(.

Díky za každou radu, ona to bude prkotina, LEFT JOIN se "učím" nově, tohle mi ale hlava moc nebere.
joe
Profil
Petr2:
1. Nauč se řešit chyby, takže jak už Alphard napsal, zkopíruj si SQL dotaz, co se posílá do DB a ten spusť v phpMyAdminu
2. Vybírat všechno (*) jak píše jdanek je nesmysl. Vybírej jen ty sloupce, které potřebuješ.


Zde se vrátí ID z sunlight-board-category místo sunlight-board
Ano, protože nejprve vybereš sloupce z tabulky a, potom z tabulky b:
SELECT a.title AS a_title, b.title AS b_title, a.*, b.*
a protože tam jsou stejné názvy, jednoduše se přepíšou (vybere se a.id, ale potom b.id a ten ho přepíše)

Zde se výpíše title z sunlight-board-category místo sunlight-board
Pojmenováváš si title z tabulky a a title z tabulky b, proč tam mícháš "další"? Jinými slovy tam máš mít $item['a_title'] místo $item['title']

if ($item["a_title"] = "") {
K porovnávání se používají dvě rovnítka. Tady nastavíš a_title a b_title na prázdný řetězec, proto se tam nic nevypisuje.

Proč v kódu používáš dál $item["a_title"] nebo $item["b_title"], když sis je předtím uložil do proměnné $cat_a?

$ext = substr($item['file'], 15, 18);
To není nejšťastnější způsob zjišťování přípony souboru. Co když bude mít (třeba někdy později) soubor delší název, než má teď? Co když bude přípony místo očekávané "jpg" třeba "JPG"?
jdanek
Profil
joe:
2. Vybírat všechno (*) jak píše jdanek je nesmysl. Vybírej jen ty sloupce, které potřebuješ.

proč nesmysl? Předpokládal jsem že data z tabulky, potřebuje všechny viz. obrázek. Podle bližších informací je to výpis do administrace... a tam bude zobrazeno(vložení, platnost, autor, kategorie), takže jsem vyrozuměl, že potřebuje všechny
joe
Profil
jdanek:
Vyjmenování názvů sloupců přináši několik výhod. Jednak se vybírá to, co se skutečně potřebuje, a to i v případě, že dojde ke změně struktury tabulky. Pak jsou z kódu hned patrné názvy sloupců, takže nemusíš se dívat na jiné místo. V případě vybírání potřebných sloupců je dotaz rychlejší.
Petr2
Profil *
Takže se sem vyzkoušel zkopírovat SQL do PHPMyAdmina:

SELECT a.title AS title, b.title AS b_title, a.title AS a_title, a.*, b.* FROM `sunlight-board` a LEFT JOIN `sunlight-board-category` b ON (b.id = a.category1) ORDER BY a.id DESC

Výsledek je ten, že je to ok, až na jeden detail, že místo a_title se dosadí title (čili míísto názvu kategorie se dosadí název dokumentu).



Ke zbytku poznámek se vyjádřím potom, nebojte :-), myslím na to.
Petr2
Profil *
Takže jdanek problém vyřešil, začež děkuju (problém byl meti mou židlí a klávesnicí).

joe:
„$ext = substr($item['file'], 15, 18);“
To není nejšťastnější způsob zjišťování přípony souboru. Co když bude mít (třeba někdy později) soubor delší název, než má teď? Co když bude přípony místo očekávané "jpg" třeba "JPG"?

Proč ne? Název bude pořád stejný, jelikož je soubor přejmenován o náhodný řetězec, který má vždy přesný počet míst.

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: