php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 11.10.2005, 15:58  
Gast
 
Beiträge: n/a
Standard [Erledigt] Irgendein Join oder doch nur GROUP ???

Hallo,

ich bin neu hier, so habt Nachsicht, wenn diese Frage schon gestellt wurde. Jedoch fällt mir auch kein passender Suchbegriff ein. Ich habe folgendes Problem:
Ich habe eine Tabelle mit zwei Spalten (vereinfacht). In Spalte a sind viele Schlüssel (zeigen auf andere Tabellenzeilen) und in Spalte b ebenfalls. Nun kommen sowohl in Spalte a, als auch Spalte b beinahe alle Werte mehrfach vor. Beispiel:
a b
17 3
15 4
17 5
17 6
15 3 ...
Ich möchte jetzt eine Abfrage haben, die mir zu einem vorgegebenem Schlüssel aus Spalte a sämtliche Schlüssel aus Spalte b liefert, also:

SELECT b WHERE a=17;

Als nächstes möchte ich nun wissen, wie häufig die gefundenen Schlüssel aus Spalte B überhaupt sonst noch vorkommen. Also:

xx = Suchergebnis aus Abfrage 1
SELECT COUNT(*) WHERE b = 'xx' GROUP BY b;

Bei mehreren Suchergebnissen aus Anfrage 1 muss ich die 2. Anfrage jedoch recht häufig stellen. Ok, ich könnte es mittels OR auf eine weitere Suchabfrage beschränken, doch ist es recht unsauber, da ich nachher das Array wieder auseinanderfrickeln müsste.

Gibt es eine elegantere Lösung als Befehl, der mir zum einen das Suchergebnis aus Abfrage 1 liefert, jedoch zusätzlich eine weitere Spalte in der die Häufigkeit des Vorkommens des Schlüssels in Spalte b liefert?

Zur Erklärung: Es handelt sich bei Spalte a um Film-Identifikationsnummern und bei Spalte b um Personennummern. Ich möchte also zum einen eine Suchabfrage, die mir sämtliche Personen zu einem Film liefert, jedoch zusätzlich auch angibt, in wievielen Filmen diese Person insgesamt mitgewirkt hat.

Vielen Dank für Eure Mühe schon einmal im voraus,

Marco
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 11.10.2005, 16:53  
Erfahrener Benutzer
 
Registriert seit: 05.07.2004
Beiträge: 1.476
DiBo33
Standard

Wenn ich dich richtig verstanden habe

Code:
SELECT  t1.a, t1.b, COUNT( t2.b ) anz
FROM tabelle t1
JOIN tabelle t2
ON t1.b = t2.b
WHERE t1.a =17
GROUP BY t2.b
Aber, du hast alles in einer Tabelle?
Suche mal unter den Stichwort Normalisierung
[edit]Uuups, es ist ja deine Schlüsseltabelle, betrachte also mein letzten Satz als nicht geschrieben [/edit]
DiBo33 ist offline   Mit Zitat antworten
Alt 11.10.2005, 17:41  
Gast
 
Beiträge: n/a
Standard

Es handelt sich lediglich um eine einzige Tabelle mit den angegebenen zwei Spalten. Auf dieser Tabelle möchte ich quasi zwei Abfragen nacheinander in eine packen. Es soll also zuerst die Zeilen gesucht werden, bei denen in Spalte a ein bestimmter Wert steht. Dann möchte ich für jeden gefundenen Wert aus Spalte b geliefert bekommen, wie häufig er insgesamt in der Tabelle steht.

Die Ergebnistabelle aus dem obigen Beispiel müsste dann folgendermaßen aussehen, wenn man nach dem Wert 17 sucht:

a------b-----count()
17----3--------2
17----5--------1
17----6--------1
  Mit Zitat antworten
Alt 11.10.2005, 17:43  
Erfahrener Benutzer
 
Registriert seit: 05.07.2004
Beiträge: 1.476
DiBo33
Standard

Ja, habe ich voll verstanden.

Und was macht mein Beispiel anders?
DiBo33 ist offline   Mit Zitat antworten
Alt 11.10.2005, 19:37  
Gast
 
Beiträge: n/a
Standard

Es gibt nur eine Tabelle, also nicht t1 und t2. Wenn ich den Befehl ausführe und beidesmal die gleiche Tabelle t1 angebe, kommt die SQL-Fehlermeldung

#1066 - Not unique table/alias: 't1'

Das funktioniert wohl doch nur mit verschiedenen Tabellen, oder
  Mit Zitat antworten
Alt 11.10.2005, 19:57  
Erfahrener Benutzer
 
Registriert seit: 05.07.2004
Beiträge: 1.476
DiBo33
Standard

Mach dich mal über ALIAS schlau.
http://dev.mysql.com/doc/mysql/en/legal-names.html

Um t1, t2 und anz handelt es sich jeweils um einen ALIAS.

Da deine gesuchte Abfrage nur über einen JOIN durchführbar ist und ein JOIN über die gleiche Tabelle grundsätzlich ALIAS benötigt musst du diese angeben.

"Blöder Satz, ist es schon so spät?"

Deine Tabelle heisst "filmscha" mit den Feldern a und b lt. deiner Beschreibung.

(-- ist in MSSQL ein Kommentar, bei MySQL bin ich mir jetzt nicht sicher)

Code:
SELECT  t1.a, t1.b, COUNT( t2.b ) anz
-- Hole mir a und b von der Tabelle die den ALIAS t1 besitzt
-- Zähle Feld b in der Tabelle die den ALIAS t2 besitzt und setze den ALIAS anz 
-- (Beides ist die gleiche Tabelle, nur eben unterschiedlich referenziert)
FROM filmscha t1
-- Hier wird die Tabelle das erste mal referenziert
JOIN filmscha t2
-- und mit sich selbst verknüpft 
-- (um MySQL eine Unterscheidung zu geben 
-- muss hier eine andere Referenzierung (t2) angegeben werden.
ON t1.b = t2.b
-- hier folgt die Zuordnung der 2 Referenzierungen
WHERE t1.a =17
-- also in filmscha.a soll 17 stehen
GROUP BY t2.b 
-- hier ist t2 wichtig, da sich die COUNT()-Funktion auf die
-- Refenzierung t2.b bezieht
Ich hoffe damit alle Klarheiten beseitigt zu haben

Wenn was unklar ist, fragen (ich bin mir nicht sicher, ob du mich überhaupt verstehst?)

Das Stchwort "SELF JOIN" sollte dir jedenfalls schon mal weiter helfen.
DiBo33 ist offline   Mit Zitat antworten
Alt 11.10.2005, 21:52  
Gast
 
Beiträge: n/a
Standard

Ok. Ich habs verstanden. Das Problem bestand darin, dass MySQL ein "as" zwischen Tabellenname und Alias benötigt, also in der Art "... FROM filmscha as t1 ...".
Ich bin damit n bisschen durcheinander gekommen.

Vielen Dank, DiBo33, für deine Geduld
  Mit Zitat antworten
Alt 12.10.2005, 13:08  
Erfahrener Benutzer
 
Registriert seit: 05.07.2004
Beiträge: 1.476
DiBo33
Standard

Zitat:
Zitat von wunderkinnd
Das Problem bestand darin, dass MySQL ein "as" zwischen Tabellenname und Alias benötigt
Halte ich persönlich für ein Gerücht, oder welche uralt Version nutzt du?
DiBo33 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
INNER JOIN, GROUP BY und ... schwer zu erklären abyss Datenbanken 2 15.06.2008 00:55
Mehrfach Join lazydog Datenbanken 2 08.05.2008 16:09
Frage zu meinem JOIN Statement Benjamin Such Datenbanken 4 12.04.2008 13:20
JOIN Problem pPanther Datenbanken 7 06.03.2008 17:26
[gelöst]LEFT JOIN, DINSTINCT und trotzdem doppelte?!?! stefanjann Datenbanken 10 06.02.2008 11:49
performance problem mit join leo Datenbanken 4 14.01.2008 22:31
WHERE-Clause im Left Join cycap Datenbanken 2 06.11.2007 11:06
JOIN / LEFT JOIN und Co prinzli Datenbanken 12 05.11.2007 22:15
Wiederholter statt neuer COUNT bei JOIN Greezoo Datenbanken 5 06.07.2007 14:10
SQL und Join tinchen Datenbanken 6 18.02.2007 15:53
Join auf 2 verschiedene Felder Tommek Datenbanken 6 25.07.2006 20:39
Problem mit Inner join Jabi Datenbanken 15 09.05.2006 14:10
INNER JOIN + Suchkriterien + Abfrage duerov PHP Tipps 2006 4 04.04.2006 12:47
inner join aus db PHP Tipps 2006 8 22.01.2006 01:23
[Erledigt] Join Datenbanken 15 09.03.2005 08:44

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
sql join auf irgendeinen satz

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:31 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.