NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 9 - MySQL krok za krokem: Dotazy přes více tabulek (JOIN)

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
FeeJay
Neregistrovaný
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ď.

 
Odpovědět
7.2.2014 21:48
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...

 
Odpovědět
15.1.2017 19:38
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?

 
Odpovědět
15.2.2017 10:19
Avatar
Odpovídá 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í...

Odpovědět
16.2.2017 13:41
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá 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"

 
Odpovědět
23.2.2017 21:40
Avatar
Odpovídá 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...

Odpovědět
24.2.2017 6:50
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
RomanP
Člen
Avatar
Odpovídá 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

 
Odpovědět
25.6.2017 21:59
Avatar
Odpovídá 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.

Odpovědět
26.6.2017 9:48
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Odpovídá 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();
Odpovědět
26.6.2017 9:53
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

 
Odpovědět
10.7.2018 17:02
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 40.