Autor | Zpráva | ||
---|---|---|---|
leorond Profil |
#1 · Zasláno: 10. 11. 2015, 19:42:01
Ahoj, mám tu jednu celkem jednoduchou otázečku ale rád bych se poradil zda to bude dobré řešení.
Mám 2 tabulky v MySQL do první ( Novinky ) se budou zapisovat dejme tomu id, nadpis, text, datum a do druhé ( obrazky ) se budou zapisovat uploadované obrázky například id, velikost, tip, nazev, id_id s tím že id_id ( obrazky ) = id ( Novinky ) a poté je vypíšu z DB podle shody zmíněných dvou zápisů. To znamená že bych porovnal obě tabulky a v případě shody id_id ( obrazky ) s id ( Novinky ) vypsal z DB data.
Jak přiřadit stejnou hodnotu id_id ( obrazky ) jako je id ( Novinky ) a jak by potom vypadal select? Děkuji |
||
Nuimi Profil |
#2 · Zasláno: 10. 11. 2015, 20:18:42
Mě přijde že je to zbytečně složité místo
id, id_id použij jmeno u obou a při ukládání do databáze jim prostě přiřadíš název toho souboru (obrázku), nebo to budeš mít v jednom php souboru a budeš jim přiřazovat 1 proměnou kterou si budeš automaticky generace (stačí funkce random)
|
||
mimochodec Profil |
leorond:
Jestli ten obrázek bude jeden, můžeš použít SELECT novinky.nadpis, novinky.text, (..), obrazky.nazev, (..) FROM novinky LEFT JOIN obrazky ON obrazky.id_id = novinky.id Pravděpodobnější ale je, že těch obrázků budeš mít v článku víc (jestli ne podle prvního návrhu, tak možná během dalšího vývoje), takže bych spíš udělal dva nezávislé selecty, jeden pro data článku, další pro obrázky, kde jen použiješ "... WHERE id_id = ".$idclanku.
V obou případech bych doporučoval sloupec id_id přejmenovat na id_clanku, ať se v tom vyznáš. A jak správně upozornil zdejší zvýrazňovač, "text" je klíčové slovo, takže ten sloupec pojmenuj třeba "textclanku". Jde to i jinak, ale ten postup je zbytečně blbej. |
||
leorond Profil |
samozřejmě se budou tabulky i sloupce jmenovat jinak jen mi jde o princip
Právě bych to chtěl mít vše v jednom souboru ( tedy kromě formuláře ) a jak jsi správně usoudil mimochodec tak jde o více obrázků, uploadovat soubory a zapsat do mysql je snadné ale možná by bylo nejlepší pomocí POST vkládat číslo které bude předvyplněné výpisem z DB například takto
Zjistím id posledního řádku v DB a zapíšu aby se vkládalo $posled_id_z_db+1 , to by mohlo klapnout a bylo by to nejjednodušší řešení možná ne? Je to samozřejmě jen příklad mého nápadu.Pokud se toto číslo vloží do obou tabulek tak by mělo být v každém případě totožné a za ten příklad výpisu děkuji Nuimi, něco takového jsem měl také na mysli. |
||
Dan Charousek Profil |
#5 · Zasláno: 10. 11. 2015, 22:49:51
leorond:
Hledáš mysqli_insert_id() // psáno objektově: # vložíme článek do db $db->query("INSERT INTO clanky VALUES(...)"); # vložíme příslušné fotografie $db->query("INSERT INTO fotografie(cesta, id_clanku) VALUES(..., " . $db->insert_id . ")"); |
||
leorond Profil |
#6 · Zasláno: 11. 11. 2015, 15:23:45
No mám takovíto skript pro výpis jen z jedné tabulky
stroje
<? $ukaz = mysql_query("SELECT * FROM stroje WHERE kategorie = '1'"); if(mysql_num_rows($ukaz)==0) { echo "Novinka nebyla nalezena!"; } else { while ($ukaz_novinku=MySQL_Fetch_assoc($ukaz)) echo "<table> <tr><td>".htmlspecialchars($ukaz_novinku["id"])."</td></tr> </table> <table> <tr><td>".htmlspecialchars($ukaz_novinku["tip"])."</td></tr> <tr><td>".htmlspecialchars($ukaz_novinku["uvodka"])."</td></tr> </table> <table> <tr><td>".htmlspecialchars($ukaz_novinku["valce"])."</td></tr> <tr><td>".htmlspecialchars($ukaz_novinku["zdvi_objem"])."</td></tr> <tr><td>".htmlspecialchars($ukaz_novinku["tip"])."</td></tr> <tr><td>".htmlspecialchars($ukaz_novinku["kw"])."</td></tr> <tr><td>".htmlspecialchars($ukaz_novinku["hp"])."</td></tr> </table>"; } ?> a tabulku v MySQL upload_stroje ve které mám sloupec id_stroje které obsahuje číslo totožné s id v tabulce stroje, potřeboval bych aby se mi vypsal název správného obrázku místo $ukaz_novinku["id"]
Dokázal by mi s tímto někdo pomoci? |
||
leorond Profil |
Jsem to ale nekňuba :D
SELECT kategorie,popis FROM stroje,upload_stroje WHERE id = id_stroje nesmím mít duplicitní sloupec v tabulkách a JOIN použít vlastně ani nemusím :)Ještě bych potřeboval udělat aby se mi z jedné tabulky vypsal pouze ten jeden konkrétní řádek a z druhé všechny řádky které odpovídají id z první tabulky Mám tento kód <? $ukaz = mysql_query("SELECT * FROM stroje,upload_stroje WHERE id = id_stroje AND kategorie = '1'"); if(mysql_num_rows($ukaz)==0) { echo "Novinka nebyla nalezena!"; } else { while ($ukaz_novinku=MySQL_Fetch_assoc($ukaz)) echo "<table> <tr><td>".htmlspecialchars($ukaz_novinku["name"])."</td></tr> </table> <table> <tr><td>".htmlspecialchars($ukaz_novinku["tip"])."</td></tr> <tr><td>".htmlspecialchars($ukaz_novinku["uvodka"])."</td></tr> </table> <table> <tr><td>".htmlspecialchars($ukaz_novinku["valce"])."</td></tr> <tr><td>".htmlspecialchars($ukaz_novinku["zdvi_objem"])."</td></tr> <tr><td>".htmlspecialchars($ukaz_novinku["tip"])."</td></tr> <tr><td>".htmlspecialchars($ukaz_novinku["kw"])."</td></tr> <tr><td>".htmlspecialchars($ukaz_novinku["hp"])."</td></tr> </table>"; } ?> Nyní to totiž vypadá tak že při výpisu 1 řádku z stroje a 2 řádků z upload_stroje se mi vypíše výsledek jako 2 záznamy které se liší pouze v name. |
||
mimochodec Profil |
leorond:
Jdeš na to špatně. Jestliže máš na stránce jeden stroj a k němu několik fotek, použij dva dotazy, na sobě nezávislé. Schamaticky: SELECT id,x,y,z FROM stroje while { echo stroje("x"); SELECT filename FROM fotky WHERE idstroje = stroje("id") while { echo fotky("filename"); } echo stroje("y"); echo stroje("z"); } |
||
leorond Profil |
<?php $result = mysql_query("SELECT * FROM stroje ORDER BY id"); while ($row = mysql_fetch_assoc($result)) { echo "<h3>$row[popis]</h3>\n"; $result1 = mysql_query("SELECT * FROM upload_stroje WHERE id_stroje = '$row[id]'"); while ($row1 = mysql_fetch_assoc($result1)) { echo "$row1[name]<br />\n"; } mysql_free_result($result1); } mysql_free_result($result); ?> Myslíš nějak takto? |
||
Fisir Profil |
#10 · Zasláno: 11. 11. 2015, 19:11:21
Reaguji na mimochodce:
Pouze podotknu, že z hlediska výkonnosti a rychlosti není žádoucí pokládat SQL dotazy v cyklu. |
||
mimochodec Profil |
#11 · Zasláno: 11. 11. 2015, 19:12:50
Tuhle syntaxi
echo "<h3>$row[popis]</h3>\n"; |
||
juriad Profil |
#12 · Zasláno: 11. 11. 2015, 19:15:52
leorond:
Ano, takto. Pro diskusi o výkonu, jak zmiňuje Fisir, se podívej na Srovnání dotazů do závislých tabulek Fisir: Napřed to leorond musí být schopen alespoň nějak udělat, než se začne zabývat výkonem. Takto to je přehledné (ehm) a není to špatně. |
||
mimochodec Profil |
Fisir:
To je pravda. Teď jasně nevidím, jestli leorond ten kód zamýšlí pro výpis více strojů, do kterého se má přidat ke každému stroji obrázek, nebo je to výpis informací o jednom rozkliknutém stroji. V druhém případě by to bylo v pořádku, v tom prvním bych spíš vyšel z #3 a jen to omezil na jednu nebo několik málo fotek. juriad: „(ehm)“ ;-) |
||
leorond Profil |
Samozřejmě ve finále bude
echo jiné, vím že to bude pomalé ale potřebuji přiřadit například 10 řádků z jedné tabulky k 1 řádku v druhé.
Chci ale těch 11 řádků vypsat v 1 tabulce. Sloučit tabulky se mi podařilo ale když udělám výpis tak se mi do tabulky zapíše pouze 1 a 1 řádek a hned pod to jde duplicita a 2 řádek Tohle je přesně to co hledám jen bych to chtěl shrnout do jednoho dotazu aby to bylo podstatně rychlejší <?php $result = mysql_query("SELECT * FROM stroje ORDER BY id"); while ($row = mysql_fetch_assoc($result)) { echo $row["popis"]; $result1 = mysql_query("SELECT * FROM upload_stroje WHERE id_stroje = '$row[id]'"); while ($row1 = mysql_fetch_assoc($result1)) { echo $row1["name"]; } mysql_free_result($result1); } mysql_free_result($result); ?> No ale buď jsem blbej nebo se v tomhle prostě nevyznám, potřeboval bych vidět jak vypadají ty DB abych to dal dohromady :D <?php $result = mysql_query(" SELECT *, Country.Name AS CountryName FROM ( SELECT * FROM City ORDER BY ID LIMIT 10 ) AS City INNER JOIN Country ON City.CountryCode = Country.Code INNER JOIN CountryLanguage ON City.CountryCode = CountryLanguage.CountryCode "); $city_id = 0; while ($row = mysql_fetch_assoc($result)) { if ($city_id != $row["ID"]) { echo "$row[Name] ($row[CountryName])\n"; $city_id = $row["ID"]; } echo "- $row[Language]\n"; } ?> |
||
Časová prodleva: 7 let
|
0