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
Kontrola má být také jen pro konkrétní hodnotu ve sloupci C? Jaké jsou primární klíče na tabulkách?
fjf
Profil
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
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
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
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
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
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 ) ) ) 
fjf
Profil
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0