Idee für MySQL-Abfrage gesucht

G

gma

Aktives Mitglied
Thread Starter
Dabei seit
18.02.2007
Beiträge
119
Reaktionspunkte
2
Hallo,

ich habe zwei Tabellen

Tabelle 1:

ID WERT

Tabelle 2:

beinhaltet nur eine Untergruppe der IDs aus Tabelle 1


Z.B.:

Tabelle 1
ID WERT
1 A
2 A
3 B
etc

Tabelle 2:

ID
1
2


Ich hätte gerne eine neue Tabelle oder am besten um eine Spalte erweiterte Tabelle 1, die eine logische Variable beinhaltet, die aussagt ob die IDs aus Tabelle 1 in Tabelle 2 vorkommen (nur ja oder nein, auch für Mehrfachnennungen nur einfach = ja).

Also Tabelle 1 modifiziert

ID WERT "Vorkommen in Tabelle 2"
1 A ja (oder 1)
2 A ja
3 B nein (oder 0)


Wie geht das?

gma
 
Du brauchst zwei korrespondierende Variablen in den zwei Tabellen. Zum Beispiel
ID in Tabelle 1 und
ReferenzIDTab1 in Tabelle 2
 
Hallo,
spontan würde ich es über nen Trigger lösen. Also die 3. Spalte in Tabelle 1 default-mäßig mit 0 belegen. Bei nem INSERT in Tabelle 2 einfach die entsprechende Zeile in Tabelle 1 editieren und eine 1 schreiben.

Viele Grüße
Arne
 
Muss das echt in der Tabelle1 eingetragen werden, oder reicht ein einfacher View aus?
 
Eine Möglickeit ist der Outer Join:
"Bei einem OUTER JOIN gibt es immer eine Tabelle, die als erhaltene Tabelle bezeichnet wird; alle ihre Zeilen bleiben erhalten. Wenn es sich um einen LEFT OUTER JOIN handelt, ist die linke Tabelle die erhaltene Tabelle; bei einem RIGHT OUTER JOIN ist es die rechte Tabelle." aus Little-Idiot.
In Deinem Fall (Mit der Syntax von MySQL bin ich nicht vertraut) sollte es ungefähr so aussehen:

SELECT A.ID, A.WERT, B.ID
FROM Tabelle 1 AS A LEFT OUTER
JOIN Tabelle 2 AS B ON A.ID = B.ID;

Damit gibt er aber kein "Ja" oder "1", sondern die ID in der dritten Spalte aus.

Am einfachsten wäre wohl ein "Union", das gibt es bei MySQL aber wohl nicht.
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

also die ID in Tabelle1 korrespondiert mit den IDs in Tabelle2, das ist also gewährleistet.

Von dem hier vorgeschlagenen Ideen komme ich zu folgendem Ansatz:

Erstmal den outer join.
In der neuen Spalte alles was keinen Wert hat = 0 setzen
für alle IDs, die dann einen Wert in der neuen Spalte haben, diesen Wert = 1 setzen

Wie mache ich letztere Abfrage, in MySQL?

gma
 
Vielleicht probierst Du einmal einen "Count(B.ID)" aus. Der sollte "0" oder leer sein, wenn keine B.ID vorhanden ist, ansonsten "1".
Dann solltest Du nur nach den ersten beiden Spalten gruppieren und dazu "Group by A.ID, A.WERT" ans Ende des SQL setzen.
 
Noch eine Idee (ich steigere mich da langsam hinein):

Es gibt wohl doch ein UNION. Siehe hier.

Dann kannst Du folgendes ausprobieren:

SELECT A.ID, A.WERT, "1"
FROM Tabelle 1 AS A, Tabelle 2 AS B
WHERE A.ID = B.ID

UNION ALL

SELECT A.ID, A.WERT, "0"
FROM Tabelle 1 AS A
WHERE NOT EXISTS (
SELECT A.ID
FROM Tabelle 1 AS A, Tabelle 2 AS B
WHERE A.ID = B.ID);

Der erste Teil gibt Dir alle IDs, die in beiden Tabellen vorkommen. Der zeite Teil gibt Dir alle ID zu denen keine ID in Tabelle 2 existert. Der "Union all" wirft das dann beides in eine Tabelle.

Ob das die korrekte Syntax ist, mußt Du ausprobieren. Wie gesgt, kenne ich MySQL nicht. Es müßte aber schneller sein, als der outer join.
 
Noch eine Idee (ich steigere mich da langsam hinein):

Es gibt wohl doch ein UNION. Siehe hier.

Dann kannst Du folgendes ausprobieren:

SELECT A.ID, A.WERT, "1"
FROM Tabelle 1 AS A, Tabelle 2 AS B
WHERE A.ID = B.ID

UNION ALL

SELECT A.ID, A.WERT, "0"
FROM Tabelle 1 AS A
WHERE NOT EXISTS (
SELECT A.ID
FROM Tabelle 1 AS A, Tabelle 2 AS B
WHERE A.ID = B.ID);

Der erste Teil gibt Dir alle IDs, die in beiden Tabellen vorkommen. Der zeite Teil gibt Dir alle ID zu denen keine ID in Tabelle 2 existert. Der "Union all" wirft das dann beides in eine Tabelle.

Ob das die korrekte Syntax ist, mußt Du ausprobieren. Wie gesgt, kenne ich MySQL nicht. Es müßte aber schneller sein, als der outer join.

Der Ansatz hört sich gut an, aber:

Ich bin leider etwas verwirrt, was meinst Du mit A oder B, ist das synonym zu Tabelle1 und Tabelle2?

gma
 
Ich wurde zwar nicht gefragt, aber ja, das meint er.

Code:
FROM Tabelle 1 AS A, Tabelle 2 AS B
 
  • Gefällt mir
Reaktionen: Biber Bruder
Zurück
Oben Unten