Autor | Zpráva | ||
---|---|---|---|
fjf Profil |
Ahojte
mám 2 tabuľky so stĺpcami: TAB1: A, B, C, D, E, F, G TAB2: A, C, G TAB2 vzniká skopírovaním TAB1: mysql_query("INSERT INTO TAB2 SELECT A, C, G FROM TAB1 WHERE C='" . $x . "'"); Ako skontrolujem, či proces prebehol korektne a či sa hodnoty v stĺpcoch A, C, G v TAB2 zhodujú s pôvodnými hodnotami v TAB1? Jedná sa rádovo o 10-tisíc riadkov. Ďakujem za odpoveď. |
||
Kajman Profil |
#2 · Zasláno: 5. 2. 2014, 09:06:26
Kontrola má být také jen pro konkrétní hodnotu ve sloupci C? Jaké jsou primární klíče na tabulkách?
|
||
fjf Profil |
#3 · Zasláno: 5. 2. 2014, 09:20:34
Kajman:
Nie, rád by som skontroloval celú TAB2, teda všetky stĺpce A, C, G (samozrejme je možné urobiť 3 kontroly po sebe, ak je to jednoduchšie). Ide o to, že ak kontrola prebehne úspešne, zmažem odpovedajúce riadky v TAB1 (no a samozrejme chcem si byť istý, že to presunutie je teda korektné). Primárnym kľúčom v oboch tabuľkách je stĺpec A. |
||
Kajman Profil |
#4 · Zasláno: 5. 2. 2014, 09:48:52
Asi by to mělo jít přibližně takto.
hodnoty sloupce A, co jsou v TAB1, ale nejsou v TAB2 SELECT t1.a, t1.c, t1.g FROM tab1 t1 LEFT JOIN tab2 t2 ON t1.a = t2.a WHERE t2.a IS NULL hodnoty sloupce A, co jsou v TAB2, ale nejsou v TAB1 SELECT t2.a, t2.c, t2.g FROM tab2 t2 LEFT JOIN tab1 t1 ON t1.a = t2.a WHERE t1.a IS NULL hodnoty sloupce A s rozdílnými hodnotami C a G SELECT t1.a, t1.c c1, t2.c c2, t1.g g1, t2.g g2 FROM tab1 t1 JOIN tab2 t2 ON t1.a = t2.a WHERE NOT ( t1.c <=> t2.c AND t1.g <=> t2.g ) |
||
fjf Profil |
Prepáč, pomýlil som sa (nepochopil som správne tvoju otázku) - správne ide o konkrétnu hodnotu v stĺpci C.
Trochu som to JOINovanie popozeral (http://www.w3schools.com/sql/sql_join_full.asp) a napadlo ma takéto riešenie: SELECT COUNT(*) FROM tab1 FULL ALTER JOIN tab2 ON tab1.a = tab2.a WHERE (tab1.c = $x OR tab2.c = $x) AND (tab1.g != tab2.g OR tab1.h != tab2.h OR ...) Moderátor Kajman: Vkládej prosím kódy mezi značky [>pre] a [>/pre] (stačí kliknout na ).
obecne, keby tam boli ďalšie totožné stĺpce H, ... Správne? |
||
Kajman Profil |
#6 · Zasláno: 5. 2. 2014, 13:21:29
Problém je, že mysql nepodporuje full join. A ve where podmínce je potřeba ošetřil null hodnoty, pokud mohou nastat.
Podmínku na sloupec c můžete přidat do where části těch dotazů. ... AND t1.c=$x ... AND t2.c=$x ... AND (t1.c=$x OR t2.c=$x) |
||
fjf Profil |
Hm, keďže stĺpec A je primárny kľúč s autoincrement, myslím, žeby nemalo byť potrebné hľadať null hodnoty.
Takže: SELECT COUNT(*) FROM tab1 JOIN tab2 ON tab1.a = tab2.a WHERE (tab1.c = $x OR tab2.c = $x) AND (tab1.g != tab2.g OR tab1.h != tab2.h OR ...) Moderátor Kajman: Vkládej prosím kódy mezi značky [>pre] a [>/pre] (stačí kliknout na ).
Ešte raz dík za pomoc. |
||
Kajman Profil |
#8 · Zasláno: 5. 2. 2014, 15:32:50
Dotaz z [#7] Vám neošetří stav, kdy se to kopírování nepovedlo takovým způsobem, že nějaká hodnota A z TAB1 vůbec v TAB2 není. Nebo naopak - což si nejsem jistý, jestli je na závadu.
Také je jiné řešení - při mazání z TAB1 můžete do where podmínky přidat, že musí ta hodnota existovat v TAB2. |
||
fjf Profil |
#9 · Zasláno: 5. 2. 2014, 16:34:09
Jasné, takže riešením je teda LEFT JOIN? Potrebné je len skontrolovať, či sú všetky z TAB1 v TAB2 (keďže TAB2 je kópiou TAB1):
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 ...) Vyhodil som tiež z WHERE tab2.c = $x. Toto by už teda hádam mohlo fungovať...? |
||
Kajman Profil |
#10 · Zasláno: 5. 2. 2014, 18:32:31
Zlobily by null hodnoty, zkuste raději
SELECT Count(*) FROM tab1 LEFT JOIN tab2 ON tab1.a = tab2.a WHERE tab1.c = '$x' AND ( tab2.a IS NULL OR ( NOT ( tab1.c <=> tab2.c AND tab1.g <=> tab2.g ) ) ) |
||
Časová prodleva: 3 dny
|
|||
fjf Profil |
#11 · Zasláno: 8. 2. 2014, 23:16:02
Kajman:
OK, to overovanie IS NULL tam musí byť. P.S.: Nie celkom tomu rozumiem, keďže LEFT JOIN by tam mal zobrať všetky riadky z tab1, pre ktoré nenájde zhodu a zhodu nemohol nájsť, keď tam ten riadok nie je... takže je to systémová vec s NULL hodnotami, ak to správne chápem. Opätovne ďakujem. |
||
Kajman Profil |
#12 · Zasláno: 9. 2. 2014, 20:18:12
Dotaz vezme všechny řádky z tab1, kde ve sloupci c je hledaná hodnota. Zkusí k nim připojit všechny možné řádky z tabulky tab2, kde se sloupce a rovnají. Pokud nějaká hodnota a z tab1 není v tab2, budou díky left joinu vyplněny sloupce z tab2 null hodnotami. tab2.a IS NULL je tedy podmínka na vypsání takových řádků, které se do tab2 nedostaly. Druhá podmínka za or vypíše ty, kde se liší sloupec c nebo g.
|
||
Časová prodleva: 10 let
|
0