Zadejte hledaný výraz...
Jakub Glos
Webtrh.cz
Vývoj webových stránek na WordPressu a proklientský přístup pro freelancery
Třídenní infromacemi nabitý prezenční + online kurz v Praze od Webtrhu pouze za 2 871 Kč
Více informací

Spojení tabulek SQL

table
verified
rating uzivatele
12. 10. 2013 14:37:46
Přeji hezké sobotní odpoledne,
potřeboval bych radu od zdejších programátorů.
Vytvořil jsem si vlastní chat, zprávy a uživatele vypisuji pomocí tohoto sql dotazu:
SELECT `chat`.`message`,
`chat`.`timestamp`,
`chat`.`ip`,
`uzivatele`.`jmeno`,
`uzivatele`. `id`,
`uzivatele`. `admin`
FROM `chat`
JOIN `uzivatele`
ON `chat`.`id` = `uzivatele`.`id`
ORDER BY `chat`.`timestamp`
DESC LIMIT 20
Toto vše pracuje jak má.
Nyní se ale dostávám k problému který nevím jak vyřešit.
Vytvořil jsem si v DB novou tabulku slova kde je seznam nevhodných slov, ve sloupci fuj_slova které pak bych chtěl nahrazovat ***** pokud se vyskytne to fuj_slovo v odeslané zprávě.
Jak mám tuto tabulku do toho sql dotazu dostat když nemá s těmi 2 tabulkami společný žádný klíč?
Budu vděčný za pomoc.
Celý php kód zde:
class Chat extends Core{
public function fetchMessages() {
$this->query("
SELECT `chat`.`message`,
`chat`.`timestamp`,
`chat`.`ip`,
`uzivatele`.`jmeno`,
`uzivatele`. `id`,
`uzivatele`. `admin`
FROM `chat`
JOIN `uzivatele`
ON `chat`.`id` = `uzivatele`.`id`
ORDER BY `chat`.`timestamp`
DESC LIMIT 20
");
return $this->rows();
}
public function throwMessage($id, $message){
$adr=$_SERVER;
$this->query("
INSERT INTO `chat` (`id`, `message`, `timestamp`, `ip`)
VALUES (" . (int)$id.", '" .$this->db->real_escape_string(htmlentities($message)) ."', UNIX_TIMESTAMP(), '$adr')
");
}
}
12. 10. 2013 14:37:46
https://webtrh.cz/diskuse/spojeni-tabulek-sql/#reply955130
Tomáš
verified
rating uzivatele
(6 hodnocení)
12. 10. 2013 14:58:27
Ahoj,
tabulka (sada záznamů), kterou ti vrátí SQL dotaz by měla obsahovat v rámci jednotlivých záznamů (řádků) vždy související data. Informace o příspěvku a jeho autorovi související zajisté jsou, takže to není problém spojit. Seznam nevhodných slov ale s tímto nic společného nemá a není jak jej logicky a slušně přidat k těmto záznamům.
V této situaci bych prostě doporučil načíst seznam nevhodných slov v jiném SQL dotazu.
Příjde mi, že prostě špatně chápeš napojování dat (a nebo jsem trošku mimo já :-D )
Představ si tyto záznamy o sloupcích jméno, text zprávy:
Jan, "Ahoj Pepo, jak je?"
Josef, "Čau, jde to, co ty?"
Jak by jsi k těmto záznamům chtěl rozumně přidat tyto záznamy?
prasátko
kanec
Dejme tomu, že takovým "kančím" způsobem by to šlo udělat připojením prasátka k Janově zprávě a kance k Josefově. Nehledě na to, že je to nesmysl, co kdyby bylo více údajů v tabulce se zprávami než v tabulce nevhodných slov (nebo naopak)?
A ještě dotaz - pole ID v tabulce "chat" a pole ID v tabulce "uzivatel" jsou primární klíče? Pokud nevíš, co to je, tak pokud uživatel Jan s ID=5 napíše více zpráv, v tabulce chat mají všechny tyto zprávy ID=5?
12. 10. 2013 14:58:27
https://webtrh.cz/diskuse/spojeni-tabulek-sql/#reply955129
table
verified
rating uzivatele
12. 10. 2013 15:18:39
Ano ID jsou primární klíče.
12. 10. 2013 15:18:39
https://webtrh.cz/diskuse/spojeni-tabulek-sql/#reply955128
Tomáš
verified
rating uzivatele
(6 hodnocení)
12. 10. 2013 15:41:42
Napsal table;1009194
Ano ID jsou primární klíče.
Pokud jdou obě ID primární klíče, tak to se potom při každém odeslání zprávy zapíše záznam jak do tabulky "uzivatele", tak do tabulky "chat"? Tzn. uživatel, co odeslal více zpráv má v tabulce "uzivatele" několik záznamů?
Chápu to tedy správně, že uživatelé nejsou registrování a ani není nutné jejich přihlášení (loginem a heslem)?
12. 10. 2013 15:41:42
https://webtrh.cz/diskuse/spojeni-tabulek-sql/#reply955127
table
verified
rating uzivatele
12. 10. 2013 15:56:42
Uživatelé jsou registrovaní a i přihlášení.
Do session ukládám jejich ID a ty následně zapisuju do tabulky chat a ve výpisu pak podle toho id vypisuju jméno z tabulky uzivatele. Tabulka uzivatele je právě tabulka kde jsou všichni registrovaní.
Nějak mi uniká co to má společnýho z mým dotazem.
Jinak chat je zde: http://erasttest.comehere.cz/chat/ bez přihlášení zprávu neodešlete, respektivě odešlete ale nikam se nezapíše.
12. 10. 2013 15:56:42
https://webtrh.cz/diskuse/spojeni-tabulek-sql/#reply955126
Tomáš
verified
rating uzivatele
(6 hodnocení)
12. 10. 2013 16:04:37
Doufám, že na tvůj dotaz stačí má odpověď i s vysvětlením, proč to nejde dohromady - stačí nebo je třeba něco dovysvětlit?
Teď jde spíše o to, že z mého pohledu je ta práce s databází špatná a snažím se ti nastínit proč.
Pokud jsou položky ID v obou tabulkách primární klíče (tzn. jedinečné) a uživatelé jsou registrovaní a přihlašují se, tak je něco špatně. V normální databázi s registrovanými uživateli by každý uživatel měl jen jeden záznam - tzn. 1 ID. V tvém podání to ovšem nejde (nedovedu si představit, jak by to šlo), protože bys tak musel u uživatele, co odeslal 2 a více příspěvků zapsat do tabulky "chat" 2 záznamy se stejným polem "ID". To ti ovšem databáze nedovolí, protože pole "ID" je primární klíč a ten musí být v rámci jedné tabulky vždy unikátní (tzn. číslo 5 je tam maximálně jednou).
Jediná možnost, jak ti to může fungovat je asi ta, že vždy při odeslání příspěvku zapisuješ záznamy do obou tabulek. Pak ale má každý uživatel v tabulce "uzivatele" více záznamů (řádků). Je tomu tak?
Pro přesnost jde o tyto dvě položky "ID" z tvého dotazu, o kterých tvrdíš, že jsou primárními klíči:
"ON `chat`.`id` = `uzivatele`.`id`"
12. 10. 2013 16:04:37
https://webtrh.cz/diskuse/spojeni-tabulek-sql/#reply955125
table
verified
rating uzivatele
12. 10. 2013 17:55:55
Asi jsem to špatně pochopil.
ID v tabulce uzivatelé je jedinečné a v tabulce chat se do sloupce id zapíše právě to id z tabulky uživatelé.
Takže v tabulce uzivatelé se opravdu vyskytuje to číslo jen jednou, v tabulce chat se zobrazuje samozřejmě vícekrát, záleží kolikrát daný uživatel pošle zpráv.
12. 10. 2013 17:55:55
https://webtrh.cz/diskuse/spojeni-tabulek-sql/#reply955124
Tomáš
verified
rating uzivatele
(6 hodnocení)
13. 10. 2013 13:40:16
Ano, takto je to pak samozřejmě správně ;-)
Jinak tip do budoucna - většinou má každá tabulka své vlastní ID jako primární klíč. Tzn. v tvém případě by v tabulce "chat" bylo pole "ID" jako primární klíč (bez vztahu k tabulce "uzivatele"). Vztah k danému uživateli by pak byl vyjádřen například polem "userID" (na kterém by se hodilo udělat normální klíč), což by bylo právě to, co máš nyní označeno jen jako "ID" - tedy ID uživatele z tabulky "uzivatele". Řazení příspěvků by jsi pak nemusel provádět dle timestampu, ale právě dle primárního klíče "chat.ID" (rychlejší, protože je to jen integer hodnota a navíc primární klíč).
A ještě na okraj, používáš v databázi vlastnost auto_increment? Samozřejmě u scriptu jako je chat jsou mé tipy třeba zbytečné, ale do budoucna se můžou hodit...
13. 10. 2013 13:40:16
https://webtrh.cz/diskuse/spojeni-tabulek-sql/#reply955123
Pro odpověď se přihlašte.
Přihlásit