Tabellen "synchronisieren"

Tabellen "synchronisieren"

am 09.01.2006 15:00:34 von phil_news

Hallo zusammen,

folgende Situation: Ich habe eine Tabelle, in der Daten für einen
Webshop gespeichert werden und zwei Tabellen, die die Daten von jeweils
einem Händler enthalten.

Nun sollen die Daten, die in den zwei Händlertabellen stehen, mit in die
eigene Tabelle übernommen werden, jedoch nur die, die nicht schon
drinstehen (synchronisieren sozusagen). Ermitteln lässt sich das über
die Felder eigene_tabelle.bestnr, haendler1_tabelle.artikelnr und und
haendler2_tabelle.artikelnr. Bisher lasse ich von einem Script für alle
Einträge aus haendler[1|2]_tabelle prüfen, ob die Artikelnummer in
eigene_tabelle drinsteht und dann ggf. anlegen. Allerdings läuft das
Script so dann durchaus ein paar Stunden und erzeugt massig Last auf dem
Server ;-)

Nun wüsste ich gerne, ob es nicht eine einfache mySQL-Abfrage gibt, die
alle haendler[1|2].artikelnr zurückgibt, die NICHT in
eigene_tabelle.artikelnr existieren, um das ganze mal in "schön" zu
erstellen.

TIA,
-Philipp

Re: Tabellen "synchronisieren"

am 09.01.2006 15:11:54 von Christian Kirsch

Philipp v. Thunen schrieb:
>
> Nun wüsste ich gerne, ob es nicht eine einfache mySQL-Abfrage gibt, die
> alle haendler[1|2].artikelnr zurückgibt, die NICHT in
> eigene_tabelle.artikelnr existieren, um das ganze mal in "schön" zu
> erstellen.
>
>
Vermutlich findest Du das Dich Interessierende im Abschnitt 'JOIN' der
MySQL-Dokumentation auf dev.mysql.com/doc

Re: Tabellen "synchronisieren"

am 09.01.2006 15:18:30 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net

Re: Tabellen "synchronisieren"

am 09.01.2006 16:22:46 von phil_news

Christian Kirsch wrote:
> Vermutlich findest Du das Dich Interessierende im Abschnitt 'JOIN' der
> MySQL-Dokumentation auf dev.mysql.com/doc

Danke für die prompte Antwort, das werde ich mir mal zu Gemüte führen!

-Philipp

Re: Tabellen "synchronisieren"

am 09.01.2006 22:09:58 von phil_news

Hallo,

ich habe jetzt folgende Abfrage verwendet:

| mysql> SELECT artikel_haendler.artikelnr FROM artikel_haendler LEFT
| JOIN artikel_eigene ON artikel_haendler.artikelnr =
| artikel_eigene.bestnr WHERE artikel_eigene.bestnr IS NULL;

Das liefert mir auch brav die entsprechende(n) Händler-Artikelnummer(n)
zurück, aber:

| 1 row in set (3 hours 54 min 41.13 sec)

Habe ich irgendwo einen Denkfehler oder darf das bei so großen Tabellen
(artikel_haendler: 68.456, artikel_eigene: 68.457 Zeilen) so lange
dauern? Der Rechner ist ein P3-800 mit 128MB RAM, wurde zu der Zeit aber
auch anderweitig genutzt.

-Philipp

Re: Tabellen "synchronisieren"

am 09.01.2006 22:18:30 von Hartmut Holzgraefe

Andreas Kretschmer wrote:
> | test=3D# select id from haendler except select id from artikel ;

mal abgesehen das die Tabellen in der ursprünglichen Frage nicht
so hießen ...

> Das so anzupassen, daß es
>=20
> a) mit MySQL geht

Es tut nicht. Auch aktuelle MySQL Versionen implementieren nur UNION
und leider weder INTERSECT noch EXCEPT.
Das ist zugegebenermaßen blöd, aber da EXCEPT eh nicht portable ist
(Oracle besteht darauf diesen Operator stattdessen MINUS zu nennen ...)

Alternativen die mit MySQL funktionieren sind (deine Tabellennamen
beibehalten):

SELECT haendler.id
FROM haendler LEFT JOIN artikel
ON haendler.id =3D artikel.id
WHERE artikel.id IS NULL;

oder ab MySQL 4.1 auch mit Subqueries

SELECT id FROM haendler
WHERE id NOT IN (SELECT id FROM artikel);

wobei mir letztere version eigentlich noch von allen dreien am
besten gefällt weil sie der umgangssprachlichen Beschreibung des
Problems am ähnlichsten ist

> b) Du aus dem Resultat der 'except' Anfrage die Daten für Dein insert=

> bekommst
>=20
> überlasse ich Dir zur Übung.

Sind wir hier jetzt in

de.comp.datenbanken.pg-statements-nach-mysql-portieren

? Diese "in postgres geht das so" hinweise in einer nicht-postgres
Newsgruppe werden auch durch ständige Wiederholungen nicht sinnvoller .=
.


--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com

http://www.mysql.com/support/

Re: Tabellen "synchronisieren"

am 09.01.2006 22:29:47 von Kai Ruhnau

Philipp v. Thunen wrote:

> ich habe jetzt folgende Abfrage verwendet:

Wofür? Ein wenig Zusammenhang wäre nicht schlecht.

> | mysql> SELECT artikel_haendler.artikelnr FROM artikel_haendler LEFT
> | JOIN artikel_eigene ON artikel_haendler.artikelnr =
> | artikel_eigene.bestnr WHERE artikel_eigene.bestnr IS NULL;
>
> Das liefert mir auch brav die entsprechende(n) Händler-Artikelnummer(n)
> zurück, aber:
>
> | 1 row in set (3 hours 54 min 41.13 sec)
>
> Habe ich irgendwo einen Denkfehler oder darf das bei so großen Tabellen
> (artikel_haendler: 68.456, artikel_eigene: 68.457 Zeilen)

Das ist vergleichsweise winzig.

> so lange
> dauern? Der Rechner ist ein P3-800 mit 128MB RAM, wurde zu der Zeit aber
> auch anderweitig genutzt.

Ich werfe mal das Wort "Index" im zusammenhang mit dem Wort "fehlend" in
den Raum. Wenn dem so ist, wird ein recht umfangreiches Kreuzprodukt
gebildet (ca. 5 Milliarden Zeilen). Aber genauere auskünfte gibt dir
EXPLAIN:

http://dev.mysql.com/doc/refman/5.0/en/explain.html

Grüße
Kai

--
This signature is left as an exercise for the reader.

Re: Tabellen "synchronisieren"

am 09.01.2006 22:59:09 von phil_news

Hartmut Holzgraefe wrote:
> Alternativen die mit MySQL funktionieren sind (deine Tabellennamen
> beibehalten):
>
> SELECT haendler.id
> FROM haendler LEFT JOIN artikel
> ON haendler.id = artikel.id
> WHERE artikel.id IS NULL;

Vielen Dank! So hatte ich mir das auch irgendwann zusammengebastelt
(nach Christians Hinweis).

> oder ab MySQL 4.1 auch mit Subqueries
> SELECT id FROM haendler
> WHERE id NOT IN (SELECT id FROM artikel);

Interessant, vielleicht sollte ich dann doch mal ein Update erwägen. Im
Moment benutze ich noch 3.23.55.

-Philipp

Re: Tabellen "synchronisieren"

am 09.01.2006 23:06:52 von phil_news

Kai Ruhnau wrote:
> Wofür? Ein wenig Zusammenhang wäre nicht schlecht.

<3t6a93-akn.ln1@gemini.pvth.net>

> Ich werfe mal das Wort "Index" im zusammenhang mit dem Wort "fehlend" in
> den Raum. Wenn dem so ist, wird ein recht umfangreiches Kreuzprodukt
> gebildet (ca. 5 Milliarden Zeilen). Aber genauere auskünfte gibt dir
> EXPLAIN:

Danke, werde ich probieren.

-Philipp

Re: Tabellen "synchronisieren"

am 10.01.2006 17:57:14 von phil_news

Kai Ruhnau wrote:
> Ich werfe mal das Wort "Index" im zusammenhang mit dem Wort "fehlend" in
> den Raum.

Ein paar Indizes haben geholfen:
| 2032 rows in set (2.28 sec)

Vielen Dank!

-Philipp