SQL Zwei Tabellen - Problem mit Join Befehl

Anna77

Newbie
Registriert
Sep. 2012
Beiträge
6
Neues Semester - Neue Herausforderung.

Liebe Leute, bräuchte Hilfe bei einer SQL Select Abfrage. Und gleichzeitig ein HALLO in die Runde, bin neu hier! :D

Die Aufgabe sieht wie folgt aus:

Ich habe zwei Tabellen: - die erste heißt "Bücher" und hat die Attribute"Label" und "Titel" - die zweite hat den Namen "Schlüsselwörter" und besitzt nur diese eine Spalte.

Ich soll jetzt ein SQL Statement formulieren, dass mir die Schlüsselwörter ausgibt, die mindestens drei mal mal in den Buchtiteln vorkommen.

Meine Probleme:

1. Es gibt keinen gemeinsamen key, über den ich joinen könnte
2. die Abfrage "mindestens 3x vorkommen" - wie formuliere ich diese?
3.Die Buchtitel bestehen aus mehreren Wörtern, die Schlüsselwörter sind ein einziger Term. Wie suche ich danach??

Ich habe überlegt, einen künstlichen key herzustellen, damit ich die zwei Tabellen verbinden kann. Allerdings hat mein Dozent betont, dass "Schlüsselwörter" nur eine Spalte besitzt sodass ich nichts hinzufügen kann/soll. Habe auch schon überlegt mit views an die Sache ranzugehen, aber ich scheitere an der Aufgabe wie ich den verdammten join hinkriege!! :freak:

Vielen Dank euch schonmal.
 
Zuletzt bearbeitet:
Danke für die schnelle Rückmeldung. Ja, ist eine Hausübung. Will auch keine Lösungen :D

Okay, die Hinweise nehme ich schonmal dankend an. :) Mache mich jetzt ans Grübeln
Ergänzung ()

Okay, ich steh total auf dem Schlauch.

select Term from Schluesselwoerter
where Titel in ( ...Unterabfrage.. )

für die Unterabfrage, hab ich mir jetzt überlegt dass dort eine Zahl rauskommt. Drei soll da rauskommen, wenns nach mir geht :D wenn ich Count benutze zählt er die verschiedenen Datensätze. Dann kommt keine drei raus. Ich glaube auch, dass ich total auf dem falschen Weg bin.
 
Zuletzt bearbeitet:
Du musst im ersten Schritt für jedes Buch herausfinden, ob überhaupt ein Schlüsselwort exisitiert (Schau dir dazu mal 'LIKE' und '%' an).
Sobald du jedem Buch ein oder mehrere Schlüsselwörter zugeordnet hast ('JOIN'), musst du lediglich noch diejenigen Bücher zählen, welche mindestens 3 Schlüsselwörter zugeordnet sind ('COUNT').

Ich hoffe, ich konnte dir helfen, ohne gleich das ganze Statement zu bauen. ;)
 
folgendes habe ich bereits:

http://sqlfiddle.com/#!2/0369e/1

die Abfrage funktioniert toll, wenn ich als title nur einzelne Wörter habe. Das ist leider nicht der Fall.

Das habe ich jetzt allerdings ohne Join hinbekommen. Ich weiß immernoch nicht, wie ich joinen soll :D join ... on... funktioniert doch nur, wenn ich Übereinstimmende Daten in den Zeilen habe. "on title like wort" funktioniert demnach nicht?!
 
Vielleicht soll dich die Aufgabe merken lassen, zu welchen Problemen schlechtes DB Design führen kann? :D

Würde mich da nicht so sehr auf ein JOIN versteifen, oder steht das explizit in der Aufgabenstellung?
 
dein SQL leicht abgewandelt um in ganzen Zeichenketten zu suchen


MSSQL
Code:
SELECT
DISTINCT
  s.wort
FROM
  schluesselwoerter AS s
  
WHERE
  (
   SELECT
    COUNT(*)
   FROM
    buecher AS b
   WHERE
-- Microsoft SQL
   CHARINDEX(s.wort,b.title) > 0
  ) >= 3


MySQL http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_instr
Code:
SELECT
DISTINCT
  s.wort
FROM
  schluesselwoerter s
  
WHERE
  (
   SELECT
    COUNT(*)
   FROM
    buecher b
   WHERE
-- MySQL
   INSTR(b.title,s.wort) > 0
  ) >= 3





und über Join

MSSQL
Code:
SELECT
  s.wort,COUNT(ba.title) AS Menge
FROM
  schluesselwoerter AS s

INNER JOIN buecher AS b
ON  CHARINDEX(s.wort, b.title) > 0

GROUP BY  s.wort

-- hier die Anzahl
HAVING  COUNT(b.title) >= 3


MySQL
Code:
SELECT
  s.wort,COUNT(ba.title) AS Menge
FROM
  schluesselwoerter s

INNER JOIN buecher b
ON  INSTR(b.title,s.wort) > 0

GROUP BY  s.wort

-- hier die Anzahl
HAVING  COUNT(b.title) >= 3


:daumen:
 
Zuletzt bearbeitet:
Explizit nicht, aber wir haben noch nicht so viel zu dem Thema gemacht als dass mir was anderes einfällt.
Ich verstehe, was zu tun ist aber habe totale Schwierigkeiten das in eine SQL Abfrage umzuwandeln:freak:

Das was riQ geschrieben hat z.B. der letzte Teil ist mir völlig unbekannt :D charindex, inner, outer join, on instr?
Alles noch nicht gemacht, aber werds mal ausprobieren. - habs ausprobiert. MYSQL ist die Lösung, nach der ich suchen musste :) DANKE an dieser Stelle. Danke natürlich auch an alle anderen!

Ich versuche noch eine alternativ Lösung zu finden, beschränkt auf das was wir bis jetzt erst gelernt haben. Nächste Woche erhalte ich die "optimale" Lösung, werde sie euch dann mal mitteilen! :)
 
Anna77 schrieb:
Das was riQ geschrieben hat z.B. der letzte Teil ist mir völlig unbekannt :D charindex, inner, outer join, on instr?
Alles noch nicht gemacht, aber werds mal ausprobieren. - habs ausprobiert. MYSQL ist die Lösung, nach der ich suchen musste :) DANKE an dieser Stelle.

;)

"INNER JOIN" und "JOIN" bedeuten das Gleiche.

Wegen Joins kann ich dir Wikipedia http://en.wikipedia.org/wiki/Join_(SQL) empfehlen.

String-Functions:

MS-SQL
http://msdn.microsoft.com/de-de/library/ms186323.aspx

MySQL
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_instr


du kannst natürlich gerne den "langsamen" LIKE operator nehmen, allerdings mit Wildcard '%' http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#operator_like

Code:
SELECT
  s.wort,COUNT(b.title) AS Menge
FROM
  schluesselwoerter s
INNER JOIN buecher b
ON b.title LIKE '%' + s.wort +'%'

GROUP BY
  s.wort
HAVING
-- z.b. mal 1
  COUNT(b.title) >= 1
 
Zuletzt bearbeitet:
Die Variante gefällt mir gut. Ist für mich mit meinem Anfängerwissen verständlicher und besser nachvollziehen :)

Erhalte an dieser Stelle " ON b.title LIKE '%' + s.wort +'%' " einen Syntaxfehler.
Habe es nun mit ('%' + s.wort +'%') versucht, bekomme allerdings keine Ergebnistabelle
 
Mit CONCAT klappts. Sogar meine ursprüngliche Abfrage

select wort from schluesselwoerter s
where (select count(*) from buecher where title like concat('%', wort, '%')) >= 3

juhu!!
 
Anna77 schrieb:
Die Variante gefällt mir gut. Ist für mich mit meinem Anfängerwissen verständlicher und besser nachvollziehen :)

Erhalte an dieser Stelle " ON b.title LIKE '%' + s.wort +'%' " einen Syntaxfehler.
Habe es nun mit ('%' + s.wort +'%') versucht, bekomme allerdings keine Ergebnistabelle

ah sorry, 'string' + 'function' ist natürlich wieder mal MSSQL...
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat

also
Code:
SELECT
  s.wort,COUNT(b.title) AS Menge
FROM
  schluesselwoerter s
INNER JOIN buecher b
ON b.title LIKE CONCAT('%', s.wort, '%')

GROUP BY
  s.wort
HAVING
-- z.b. mal 1
  COUNT(b.title) >= 1
 

Ähnliche Themen

Antworten
5
Aufrufe
1.517
R
Zurück
Oben