Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 9. diel - MySQL krok za krokom - Dotazy cez viacero tabuliek (JOIN)

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
FeeJay
Nevyplnené
Avatar
FeeJay:7.2.2014 21:48

Ahojte

mám 2 tabuľky so stĺpcami v MySQL:

tab1: a, b, c, d, e, f, g, h
tab2: a, c, g, h

tab2 vzniká skopírovaním tab1:

mysql_query("INSERT INTO tab2 SELECT a, c, g, h FROM tab1 WHERE C='222'");

Ako skontrolujem, či proces prebehol korektne a či sa skopírovali všetky požadované hodnoty? Jedná sa rádovo o 10-tisíc riadkov. Po kontrole by som rád dáta z tab1 vymazal, je to teda dosť kritická operácia.

Stĺpec A je ID a má nastavený primárny kľúč a autoincrement, stĺpec C je pre túto operáciu reprezentovaný jednou číselnou hodnotou napr. 222.

Neviem ako to správne zapísať, zdá sa, že toto nie je korektné:
SELECT COUNT(*)
FROM tab1
LEFT JOIN tab2
ON tab1.a = tab2.a
WHERE tab1.c = $x AND (tab1.g != tab2.g OR tab1.h != tab2.h OR ...)

Ďakujem za odpoveď.

Avatar
Marie Foltýnová:15.1.2017 19:38

Ahoj, hraje nějakou roli pořadí sloupců za příkazem JOIN?
Funguje mi obojí, tzn.

JOIN `uzivatele` ON `autor_id` = `uzivatele_id`

i

JOIN `uzivatele` ON `uzivatele_id` = autor_id`

ale zajímá mě, jestli je v tom nějaký rozdíl a jestli mi to při nějakém složitějším dotazu nemůže dělat paseku...

Avatar
Nikola Linková:15.2.2017 10:19

V niekoľkých aplikáciách(cms) som videla formu zápisu LEFT JOIN, má to vôbec nejaký zmysel, veď sa to v podstate interpretuje ako LEFT INNER JOIN a v takom prípade je tam LEFT úplne zbytočne, alebo sa mýlim?

Avatar
Odpovedá na Nikola Linková
Michal Štěpánek:16.2.2017 13:41

Smysl to má, protože taky můžeš použít RIGHT JOIN. Je ale pravda, že většinou se LEFT nebo RIGHT používá pouze u OUTER JOIN u INNER JOIN se to většinou neuvádí...

Odpovedať
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovedá na Michal Štěpánek
Nikola Linková:23.2.2017 21:40

ďakujem za vysvetlenie, momentálne mám iný problém, ako nastaviť v PHP "Znakovú sadu pre pripojenie k serveru" keď chcem využiť PDO?
doteraz som používala @mysql_query("set names utf8",$db_connect);
v PDO je to však úplne inak a rozhadzuje mi to diakritiku aj v DB aj na stránke, mám tam síce doplnené CHARSET=utf8, zaujímavé však je, že na niektorých hostingoch(aj na localhoste) to funguje (tu môžem nastaviť aj v PMA zn.sadu pre pripojenie na utf8), a na iných to robí problémy, a tam mi dovolí nastaviť iba utf8mb4, resp. zakaždým keď zadám utf8, tak to hneď zmení na utf8mb4
keď zadám utf8mb4 do toho PDO dotazu, tak mi vyhodí chybu o neznámej zn. sade

zápis pre PDO mám prevzatý z jedného CMS, ale veľmi tomu nerozumiem

function dbconnect($db_host, $db_user, $db_pass, $db_name, $halt_on_error = TRUE) {
        $db_connect = TRUE;
        $db_select = TRUE;
        try {
                $pdo = dbconnection(new PDO("mysql:host=".$db_host.";dbname=".$db_name.";charset=utf8", $db_user, $db_pass));
                $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
        } catch (PDOException $error) {
                $db_connect = $error->getCode() === 1049; //unknown database
                $db_select = FALSE;
                if ($halt_on_error and !$db_connect) {
                        die("<strong>Unable to establish connection to MySQL</strong><br />".$error->getCode()." : ".$error->getMessage());
                } elseif ($halt_on_error) {
                        die("<strong>Unable to select MySQL database</strong><br />".$error->getCode()." : ".$error->getMessage());
                }
        }
        return array('connection_success' => $db_connect,
                'dbselection_success' => $db_select);
}

a na query používam túto funkciu (z toho istého CMS)

function dbquery($query, $print = FALSE) {
        global $mysql_queries_count, $mysql_queries_time;
        $start_time = microtime(TRUE);
        try {
                $result = dbconnection()->prepare($query);
                $result->execute();
                if ($print == 1) var_dump($query);
                $query_time = round((microtime(TRUE)-$start_time), 7);
                $mysql_queries_time[++$mysql_queries_count] = array($query_time, $query);
                return $result;
        } catch (PDOException $e) {
                trigger_error($e->getMessage(), E_USER_ERROR);
                if ($print == 1) var_dump($query);
                echo $e;
                return FALSE;
        }
}

dá sa to nastavenie znakovej sady niekde sem zapracovať, prípadne robím chybu ja a dá sa to riešiť aj inak?
trošku ma to trápi, lebo mysql_query pomaly vychádza z "módy"

Avatar
Odpovedá na Nikola Linková
Michal Štěpánek:24.2.2017 6:50

Před pár lety (když se ještě používalo "mysql_query") jsem si čmuchnul k ASP.NET a PHP jsem navždy opustil, takže v tomto směru ti neporadím... Jedno ale vím, že bude lepší, když si na tvůj dotaz založíš nové vlákno v sekci PHP, protože tady to jednoduše zanikne (protože to je sekce o mysql) bez odpovědi...

Odpovedať
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
RomanP
Člen
Avatar
Odpovedá na Marie Foltýnová
RomanP:25.6.2017 21:59

Zjevne to roli nehraje, ale uvedomil jsem si to az v nasledujici 8. kapitole kde autor v jednom prikladu pouzil obe variace u cs. tabulky

Avatar
Odpovedá na Nikola Linková
Michal Šmahel:26.6.2017 9:48

Ahoj, používáš zdejší databázový wraper? Tam vše funguje v pohodě. Jde o to, že se jedná o statickou třídu a znaková sada se nastaví při její inicializaci a dále pak všechny dotazy pracují s danou znakovou sadou.

Alternativou je napsat si vlastní třídu (pokud ovládáš OOP) na podobné bázi.

Odpovedať
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Odpovedá na Michal Šmahel
Michal Šmahel:26.6.2017 9:53

Co se týče nastavení dané znakové sady, v PDO se předává v konfiguraci.

Tady jsem vytahal nějaké úseky ze své třídy pro znázornění, jak to zhruba funguje (odstranil jsem OOP prvky, je to jen pro názornost).

// Konfigurace (včetně znakové sady)
$pdo_config = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
        PDO::ATTR_EMULATE_PREPARES => false
];

// Připojení
$connection = @new PDO(
        "mysql:host=" . $host . ";dbname=" . $name,
        $user,
        $password,
        $pdo_config
    );

// Využití
$connection->prepate("
        -- Dotaz...
");
$connection->execute();
$connection->fetchAll();
Odpovedať
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Jakub Siobos
Člen
Avatar
Jakub Siobos:10.7.2018 17:02

V tabulce uživatel máme uzivatel_id.
Tabulku clanky chceme s tabulkou uzivatel propojit pomocí uzivatel_id ale v tabulce clanky to pojmenujeme autor_id.
Proč do tabulky clanky nedáme také uzivatel_id? Z textu jsem pochopil, že to není chyba, ale záměr. Přijde mi to zbytečné a zavádějící. Pokud to má nějaký důvod, tak mám druhý dotaz. Stalo by se něco, kdybych v tabulce clanky nechal sloupec na propojení s názvem uzivatel_id?
Děkuji a mějte se.
Jakub

Posledné komentáre sú na spodnej časti poslednej stránky.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 40.