MySQL: Referenz Tabelle mit 'and' abfragen

N8Falter74

Grünschnabel
Hallo Forum

ich habe folgendes Problem:
In meiner DB habe ich zwei Tabellen. Tabelle 1 enthält Grunddaten, die Tabelle 2 enthält Detaildaten.

Beispiel:
Tabelle Buch:
Buch_id, Titel, Standort
----------------------------------
1, 'Rosenkrieg', 'Regal 4'
2, 'Elektronik', 'Regal 4'
3, 'Motorsport aktuell', 'Regal 3'

Tabelle Referenz:
Ref_id, Buch_id, Schlagwort
-----------------------------------------
1, 1, 'Rosen'
2, 1, 'Krieg'
3, 2, '8051'
4, 2, '550'
5, 3, 'Krieg'
6, 3, BMW'
7, 3, '550'

Ich möchte nun per 'and' Abfrage die Referenztabelle nach passenden Dokumenten durchsuchen. Beispielsweise möchte ich nach 550 und BMW suchen. Das Ergebnis sollte
in diesem Fall Buch_ID = 3 sein.

Wie könnte man so ein Select Statement formulieren?

Select * from Referenz where Schlagwort like '550%' or Schlagwort like 'BMW%' group by Buch_id
Liefert mir leider zwei Ergebnisse (2, 3).

Weis jemand rat?

Sebastian
 
Hi Sebastian,

wenn Du eine AND-Abfrage machen moechtest, warum tust Du dies nicht einfach? :)

select distinct Buch_ID
from Referenz
where Schlagwort like '550%' - -bzw. ='550'
AND Schlagwort like 'BMW%'

Als Ergebnis solltest Du nun 3 bekommen.

OR = oder, eine Bedingung muss erfuellt sein
AND = und, beide Bedingungen muessen erfuellt sein.
 
Hi SQLStruggle :)

ein 'and' liefert mir kein Ergebnis (0 Rows fetched)!
Ist ja auch logisch: beide Begriffe kommen in keiner Zeile gleichzeitig vor.

Sebastian

PS: Ich hab dein Statement mal getestet, da ich es noch nicht mit Distinct nach dem select versucht habe. Ergebnis: 0 Rows matched :(
 
Mein Vorschlag:
Code:
SELECT # evtl. DISTINCT
  Buch_id, 
  Titel, 
  Standort
FROM Buch
JOIN Referenz AS r1
  ON Buch.Buch_id=r1.Buch_id
JOIN Referenz AS r2
  ON Buch.Buch_id=r2.Buch_id
WHERE r1.Schlagwort LIKE '550%' AND r2.Schlagwort LIKE 'BMW%'
Gruß hpvw
 
Hi Sebastian,

das war etwas voreilig von mir (man sollte die Sachen ausprobieren, bevor man postet :rolleyes: ) ...

So geht's auch:

Code:
( select distinct Buch_ID
from Referenz
where Schlagwort like '550%' ) -- liefert 2 und 3
intersect -- sowohl in {2,3} also auch in {3}
( select distinct Buch_ID
from Referenz
where Schlagwort = like 'BMW%' ) -- liefert 3
Wenn Du allerdings eine aeltere MySQL Version hast, dann funktioniert's evtl. nicht.
 
Hallo Forum

nach ein bischen rumprobieren habe ich nun folgende Lösung gefunden. Ich bin mit Ihr aber noch nicht ganz zufrieden, da dieser Vorschlag sicherlich recht viel Serverresourcen verbraucht: (weis da jemand vieleicht mehr?)

Code:
Select * from buch left join referenz as ref using(buch_id)

where buch.buch_id = ref.buch_id

and ref.buch_id in (select distinct buch_id from referenz where schlagwort like '550%')
and ref.buch_id in (select distinct buch_id from referenz where schlagwort like 'BMW%')

Group By buch.buch_id

Ich habe auch gerade den Tipp von hpvw ausprobiert. Der liefert auch das richtige Ergebnis. Super :)

@hpvw: Wie schätzt du die Serverbelastung gegenüber meinem Vorschlag ein?

Sebastian
 
N8Falter74 hat gesagt.:
@hpvw: Wie schätzt du die Serverbelastung gegenüber meinem Vorschlag ein?
Da kann ich nur raten. Es hängt sicherlich sehr von der Query-Optimierung der jeweiligen Datenbankversion ab. Pauschale Aussagen können vermutlich nur die Entwickler machen. Wenn Du es genau wissen willst und es sehr auf die Performance ankommt (kommt es immer :D), solltest Du beide Queries ausführen und die Zeit stoppen.
Ich vermute, dass mit zunehmenden Datenbestand Dein Query performanter wird als meins. Bei wenig Datensätzen sollte der Unterschied nicht meßbar sein.

Gruß hpvw
 
Hi Sebastian,

peinlich war meine vorschnelle Antwort ...

Subqueries (also Unterabfragen mit z.B. UNION, INTERSECT, IN, < ...) sind in MySQL erst ab einer bestimmten Version moeglich. Ich erinnere mich daran, dass ich fuer eine Webseite versucht habe, mit Subqueries zu arbeiten. Auf meinem PC hat alles wunderbar funktioniert; die MySQL-Version, die auf dem entsprechenden Server installiert war, war jedoch aelter und die Subqueries haben dann nicht funktioniert.

Ansonsten kann ich Subqueries nur empfehlen! Damit macht es einfach mehr Spass als mit den meiner Meinung nach etwas unuebersichtlichen JOIN Konstrukten.
 
SQLstruggle hat gesagt.:
Hi Sebastian,

peinlich war meine vorschnelle Antwort ...

Subqueries (also Unterabfragen mit z.B. UNION, INTERSECT, IN, < ...) sind in MySQL erst ab einer bestimmten Version moeglich. Ich erinnere mich daran, dass ich fuer eine Webseite versucht habe, mit Subqueries zu arbeiten. Auf meinem PC hat alles wunderbar funktioniert; die MySQL-Version, die auf dem entsprechenden Server installiert war, war jedoch aelter und die Subqueries haben dann nicht funktioniert.

Ansonsten kann ich Subqueries nur empfehlen! Damit macht es einfach mehr Spass als mit den meiner Meinung nach etwas unuebersichtlichen JOIN Konstrukten.
Subqueries gibt es in MySQL ab Version 4.1. In der Regel gibt es bei den üblichen Hostern 4.0 oder sogar nur eine 3.x. IN kannst Du meines Wissens auch in älteren Versionen verwenden, dann natürlich nicht mit Subquery. Du kannst aber das Subquery vorweg ausführen, Dir einen String mit den erhaltenen IDs, durch Komma getrennt erstellen und den String in den Klammern von IN in das Query einfügen.

Gruß hpvw
 
Zurück