Autor | Zpráva | ||
---|---|---|---|
MaK Profil |
#1 · Zasláno: 19. 3. 2014, 15:01:52
Pokud v phpMyAdmin 4.1.8 jsem v db1 a položím dotaz:
SELECT id FROM ( SELECT id FROM tab_a WHERE id < 10 ) AS dt LEFT JOIN db2.tab_b USING(id) WHERE db2.tab_b.x IS NULL dostanu chybu: #1146 - Table 'db2.tab_a' doesn't exist. Ale proc proboha jde do db2, kdy ma jit do aktualni DB, kterou je db1? V general query logu je: 1 Init DB db1 1 Init DB db2 1 Query SELECT id ... Proc phpMyAdmin mění databázi? Pokud za dotaz pripojim: ;-- asi ho donutim běžet nějakou multiple-statement-větví, vše proběhne korektně a v logu je: 1 Init DB db1 1 Query SELECT id ... Jak přinutit phpMyAdmin aby nedělal takové koniny? MaK |
||
Tori Profil |
No a když doplníte název DB i do poddotazu? (Připadá mi to v pořádku, že PMA parsuje lineárně to SQL, nejdřív naváže spojení s výchozí DB, pak uvidí db2 a naváže spojení s ní. Možná při tom navázání spojení se rovnou nastaví, že se má používat tato DB. Takže když pak v poddotazu není DB uvedená, tak se použije poslední, ke které se PhpMyAdmin připojil - čili db2.)
|
||
Amunak Profil |
#3 · Zasláno: 19. 3. 2014, 15:21:33
Zkus tam prvně zkusit spustit příkaz
USE dbname; Ale mně to nikdy problém nedělalo. |
||
peta Profil |
Mi to taky prijde logicke. Kdyz neuvedes jmeno db, kdyz pouzivas dve odlisne db, ze pouzije db2, ktere tam uvedene mas.
|
||
MaK Profil |
#5 · Zasláno: 20. 3. 2014, 11:20:12
Tori:
„PMA parsuje lineárně to SQL, nejdřív naváže spojení s výchozí DB“ Proč PMA parsuje dotaz? Amunak: „Zkus tam prvně zkusit spustit příkaz...“ Nepomuze, tady je log: 1 Init DB db1 1 Query USE db1 1 Init DB db2 1 Query SELECT id ... peta: „Mi to taky prijde logicke.“ Všem připadá logické, že pokud do "okénka" nad kterým je napsáno: "Run SQL query/queries on database db1:" napíšu dotaz, PMA se zamyslí a zvolí db2!? Proč pak tuto logiku nepožije při dotazu: SELECT id FROM tab_a LEFT JOIN db2.tab_b ... MaK |
||
Tori Profil |
MaK:
„Proč PMA parsuje dotaz?“ Jen se domnívám, že tak činí. Nepitvala jsem PMA. Nicméně - PMA tvoří PHPčkové skripty, takže musejí někde a nějak navázat spojení se všemi DB, s nimiž chtějí pracovat, ne? Samozřejmě nejjednodušší způsob, jak zjistit, jak PMA přemýšlí, je podívat se do zdrojáku. edit: Zběžně jsem koukla do kódu, nějaké parsování SQL a detekce názvů DB se tam opravdu děje. A zkusil jste teda dopsat databázi i do toho poddotazu, jestli to bude fungovat správně? |
||
peta Profil |
MaK:
Protoze je to Join tabulky. V prvnim pripade musi nejdriv zpracovat vnitrek dotazu, coz ho prepne na db2. Ale uznavam, ze to muze byt zajimavy problem, kdyz tam podobnych veci mas v dotaze vic, ze ti je vsechny prepne na db2 :) Jen proste v examplech takove veci obvykle mas napsane spravne, kdyz stridas db. |
||
MaK Profil |
#8 · Zasláno: 20. 3. 2014, 12:35:18
peta:
„V prvnim pripade musi nejdriv zpracovat vnitrek dotazu, coz ho prepne na db2“ Kdo zpracuje vnitřek dotazu? Snad SQL. Kdo přepne DB? Doteď jsem žil v představě, že žadný select nepřepne aktuální DB a všechna jména tabulek, kterým nepředchazí jméno databáze, jsou brány jako tabulky z aktuální DB. To neplatí? MaK |
||
Kajman Profil |
#9 · Zasláno: 20. 3. 2014, 12:46:43
Ano, je to nelogická chyba v PMA, ale asi je potřeba stěžovat u jejich vývojářů.
|
||
Časová prodleva: 10 let
|
0