• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Datenbank abfrage über mehrere tabellen

TecEye

New member
Hy, also ich habe eine Verzeichnisdatenbank lib_betriebe, denen kann man zB. Merkmale anhängen die wiederum in data_merkmale mit einem connector gespeichert werden

die abfrage
Code:
SELECT * FROM lib_betriebe a, data_merkmale b WHERE (a.code = b.connector AND b.type = '14d2365405d1f4eb5a40411016bef0a2') ORDER BY a.name ASC
gibt mir genau aus welcher betrieb das merkmal 14d2365405d1f4eb5a40411016bef0a2 hat, soweit so gut.

allerdings wenn ich jetzt kein merkmal abfrage
Code:
SELECT * FROM lib_betriebe a, data_merkmale b WHERE (a.name LIKE '%neu%') ORDER BY a.name ASC
oder das ganze negiere
Code:
SELECT * FROM lib_betriebe a, data_merkmale b WHERE (a.code = b.connector AND b.type != 'cf4e0ed481afcdd7f746d9fdca40cdc2') ORDER BY a.name ASC
spuckt er jeden Eintrag zigmal aus, kann mir mal jemand sagen was ich depp falsch mache?


Ratlosigkeit Teil 2:
Code:
SELECT * FROM lib_betriebe a, data_merkmale b WHERE (a.code = b.connector AND b.type = '5a614e129fee207e90f43e0c6ea65288') ORDER BY a.name ASC
wirft mir Betrieb XYZ aus
Code:
SELECT * FROM lib_betriebe a, data_merkmale b WHERE (a.code = b.connector AND b.type = '4fc27424b8688746ca1a4acc3f1f98e8') ORDER BY a.name ASC
wirft mir auch Betrieb XYZ aus, weil er auch coch dieses zweite Merkmal hat, aber beides zusammen
Code:
SELECT * FROM lib_betriebe a, data_merkmale b WHERE (a.code = b.connector AND b.type = '5a614e129fee207e90f43e0c6ea65288') AND (a.code = b.connector AND b.type = '4fc27424b8688746ca1a4acc3f1f98e8') ORDER BY a.name ASC
will er nicht, kommt nix bei raus, obwohl Betrieb XYZ beide Merkmale hat

- - - Aktualisiert - - -

also wie ich das sehe sucht a.code = b.connector in einer zeile, die kann ja logischerebeide nicht beide type sein :/ wo ist mein denkfehler?
 
Zuletzt bearbeitet:
spuckt er jeden Eintrag zigmal aus, kann mir mal jemand sagen was ich depp falsch mache?
Naja - das spuckt hald für jedes Merkmal, das ein Betrieb hat, eine Zeile aus. Wie sollen denn sonst alle Merkmale ausgegeben werden? Beschäftige dich mal tiefer mit JOINs (INNER und OUTER).
Wenn du wirklich nur eine Zeile für jeden Betrieb haben willst, der das Merkmal nicht hat, kannst du entweder mit Subqueries oder INNER JOINs arbeiten.
wo ist mein denkfehler?
Auch hier muss du mit Subqueries oder INNER JOINs arbeiten. Also eine für jedes Merkmal und dann testen, dass der code in beiden Subqueries enthalten ist.
 
ich JOIN ja schon, nur halt im intuitiven Theta-Stil. Also subqueries binden nochmal einen SELECT ins WHERE ein ok, aber inwiefern sucht mir dieses Verfahren raus ob:
betriebscode = connector ist und zudem die zwei datenbankeinträge in merkmale hat?
Kannst du mir da ein Beispiel machen?
 
Code:
SELECT *
FROM `lib_betriebe`
WHERE
	`code` IN (
		SELECT `connector`
		FROM `data_merkmale`
		WHERE `type` = '5a614e129fee207e90f43e0c6ea65288'
	) AND
	`code` IN (
		SELECT `connector`
		FROM `data_merkmale`
		WHERE `type` = '4fc27424b8688746ca1a4acc3f1f98e8'
	)
ORDER BY `name` ASC

- - - Aktualisiert - - -

Ungetestet.
 
Habs mal erstmal mit einem getestet, leider kommt nichts bei raus :/
Code:
SELECT * FROM 498901_lib_betriebe WHERE `code` IN (SELECT `connector` FROM 498901_merkmale WHERE `type` = '5a614e129fee207e90f43e0c6ea65288') ORDER BY name ASC
Soll in dem Fall `code` IN (SELECT `connector`... die Brücke schlagen wie 498901_lib_betriebe.code = 498901_merkmale.connector?
 
Was genau soll denn ausgegeben werden?

SELECT * FROM
lib_betriebe a INNER JOIN data_merkmale b
on (a.code = b.connector)
WHERE (a.name LIKE '%neu%') ORDER BY a.name ASC

sollte dir beide Tabellen über code und connector verknüpfen und die Schnittmenge ausgeben
 
Zurück
Oben