mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Sa 20.04.2024 01:16 Benutzername: Passwort: Auto-Login

Thema: [MySQL] Join über 3 und mehr Tabellen … vom 26.09.2006


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> [MySQL] Join über 3 und mehr Tabellen …
Seite: 1, 2  Weiter
Autor Nachricht
beeviZ
Threadersteller

Dabei seit: 30.09.2002
Ort: -
Alter: -
Geschlecht: Männlich
Verfasst Di 26.09.2006 16:15
Titel

[MySQL] Join über 3 und mehr Tabellen …

Antworten mit Zitat Zum Seitenanfang

Hallo liebe Forengemeinde.

Kommen wir direkt zu meinem Problem. Ich habe eine DB mit einigen Tabellen. Unter anderem:

Code:
main:         gastro_id | name
type:         type_id | type_name
main_x_type:  gastro_id | type_id


ich möchte jetzt nach "type_name" aus der tabelle type suchen können, und dann alle läden aus der tabelle main angezeigt kriegen, die in der "main_x_type" den entsprechenden "type_name" zugeordnet haben.

das problem an der ganzen sache ist, das einem laden mehrere typen zugeordnet werden können. beispielweise:

Code:
main: 1 | Extrablatt
type: 1 | Café
type: 2 | Kneipe
main_x_type: 1 | 1
main_x_type: 1 | 2


ok. nun soll man aber wenn man nach "Café" und "Kneipe" sucht, "Extrablatt" angezeigt kriegen, denn der gastro_id vom extrablatt (1) sind ja in der "main_x_type" die typen 1 UND 2 zugeordnet.

Mit dieser Query:
Code:
SELECT * FROM `g_type` AS a, `g_main_x_type` AS b, `g_main` AS c
   WHERE a.type_name = 'Café'
   AND a.type_id = b.type_id
   AND c.gastro_id = b.gastro_id
   AND a.type_name = 'Kneipe'

funktionierts logischerweise nich.

Tar hat mir gerade im Chat schon geholfen. Aber der macht gerade Mittag oder so *g* und ich brauch dringend ne Lösung dafür Menno!

Einer ne Idee? Was Joins angeht bin ich voll der Anfänger. *Schnief*


//edit:
ok, mit
Code:
SELECT * FROM `g_main_x_type` AS a LEFT JOIN `g_main` AS b ON (a.gastro_id = b.gastro_id) LEFT JOIN `g_type` AS c ON (a.type_id = c.type_id)
funktioniert das ganze jetzt soweit. WHERE geht aber immernoch nich. was wohl daran liegt das das im prinzip die gleiche query in grün is wie oben ...

also wie kann ich dem user ermöglichen nach einem lokal zu suchen, das die anforderungen erfüllt: typ=bar && typ=restaurant. Ich glaube mit einem einfachen join kommt man da nicht weit. soweit kamen wir zumindest gerade im chat. evtl irgendwer ne idee wie das mit subqueries zu lösen ist? oder ne entsprechende ressource (mal abgesehen von der mysql doku) wo sowas beschrieben wird? genial wären natürlich praxisbeispiele ...


Zuletzt bearbeitet von beeviZ am Di 26.09.2006 18:14, insgesamt 5-mal bearbeitet
  View user's profile Private Nachricht senden
Account gelöscht


Ort: -
Alter: -
Verfasst Di 26.09.2006 20:35
Titel

Antworten mit Zitat Zum Seitenanfang

hm ich nenn das immer ungenau indextabelle, immerhin kann man die beziehung unter den Tabellen als eine n:n-Beziehung vorstellen.

Also, du hast bspw. eine Sache, der mehrere andere Dinge zugeordnet werden. Diese anderen Sachen sollen wieder in einer Relation hinterlegt werden.

Sachentabelle:
ID|Sachenname

Dingetabelle:

ID1|Dingname1
ID2|Dingname2
...

Zuordnungstabelle Sache-Dinge:
Sachen_ID|Ding_ID1
Sachen_ID|Ding_ID2
...

Damit kannste über mehrere Abfragen, ggf. mit JOIN und Aggregat + GROUP BY-Statements alles an Informationen herleiten, ohne Redundanzen zu riskieren. Hoffe, das hilft dir. Ansonsten schau ich morgen nochmal in ner freien Minute rein und formuliere ein paar Beispielstatements...


Zuletzt bearbeitet von am Di 26.09.2006 20:41, insgesamt 2-mal bearbeitet
 
Anzeige
Anzeige
beeviZ
Threadersteller

Dabei seit: 30.09.2002
Ort: -
Alter: -
Geschlecht: Männlich
Verfasst Mi 27.09.2006 00:35
Titel

Antworten mit Zitat Zum Seitenanfang

ja. ich kriegs nur wie gesagt nich hin.
suchen können soll man beispielsweise nen laden, der sowohl als bar, als auch als restaurant eingestuft is. man müsste dann (vereinfacht) halt sowas machen wie WHERE type_name = bar AND type_name = restaurant.

ich komm allerdings nur soweit das ich zwar läden zeilen zurückbekomme wo die richtigen läden den richtigen typen zugeordnet sind, bekomme aber jedesmal pro typ eine zeile. als in meinem beispiel halt eine zeile mit type_name "bar" und eine zeile mit type_name "restaurant".

ne beispielquery fänd ich sehr geil, dann würd ichs vielleicht auch mal gebacken kriegen.
  View user's profile Private Nachricht senden
Account gelöscht


Ort: -
Alter: -
Verfasst Mi 27.09.2006 15:00
Titel

Antworten mit Zitat Zum Seitenanfang

Code:
SELECT ladenName FROM laeden AS l
INNER JOIN map_laeden_typen AS m ON l.id = m.ladenId
INNER JOIN typName AS t ON t.id = m.typId
WHERE t.typName = 'Restaurant' OR t.typName = 'bar'
GROUP BY ladenName;


versuchts mal so, hab ich nicht getestet, sollte aber hinhauen. musste halt noch auf deine Struktur hin zurechtstückeln. Die Namen hab ich mal sprechend gewählt.


Zuletzt bearbeitet von am Mi 27.09.2006 15:07, insgesamt 2-mal bearbeitet
 
beeviZ
Threadersteller

Dabei seit: 30.09.2002
Ort: -
Alter: -
Geschlecht: Männlich
Verfasst Do 28.09.2006 15:45
Titel

Antworten mit Zitat Zum Seitenanfang

weiß nich. hat auch nich mehr funktioniert als das was ich bisher schon hatte. ich hab das problem zur allgemein besseren verständnis mal ein wenig visualisiert Grins




oben wie man unschwer erkennt die 3 tabellen in der db.

unten die suchmaske wie die sich später mal vorstellen muss. Auswählen kann man dann später alle Checkboxen, oder nur eine, oder 3 oder wie man halt will ...

jetzt brauch ich aber ne query, die mir sagt nur der laden mit der gastro_id 1 (in g_main_x_type) erfüllt die bedingung type_id = 2 (Café) UND type_id = 3 (Bar). Mit den Zuordnungen was welcher typ is, und welche gastro_id zu welchem namen gehört kann ich später meinetwegen noch in ner Extra Query machen notfalls. ich brauch nur erstmal die Query die mir sagt:
type_id = 2 && type_id = 3 werden erfüllt von gastro_id = 1.
  View user's profile Private Nachricht senden
Account gelöscht


Ort: -
Alter: -
Verfasst Do 28.09.2006 15:47
Titel

Antworten mit Zitat Zum Seitenanfang

Das macht das Teil doch... mehr kann ich dir auch nicht sagen, die Transferleistung musst du schon selbst erbringen...
 
Account gelöscht


Ort: -
Alter: -
Verfasst Do 28.09.2006 15:54
Titel

Antworten mit Zitat Zum Seitenanfang

hm... schnellschuss, ungetestet wie immer:
Code:

SELECT gastro_name FROM g_main
INNER JOIN g_main_x_type ON g_main_x_type.gastro_id = g_main.gastro_id
INNER JOIN g_type ON g_type.type_id = g_main_x_type.type_id
WHERE g_type.type_name = 'Kneipe' OR g_type.type_name = 'Café'
GROUP BY g_main.gastro_name;



also... denk mal das stimmt, berichtigen lass ich mich natürlich.
 
beeviZ
Threadersteller

Dabei seit: 30.09.2002
Ort: -
Alter: -
Geschlecht: Männlich
Verfasst Do 28.09.2006 15:58
Titel

Antworten mit Zitat Zum Seitenanfang

nee. leider ja eben nich ganz. also ich hab in der DB bisher 2 läden:

g_main:
gastro_id | name
1 elFulanito
2 Platz an der Sonne

g_type
type_id | type_name
1 Restaurant
2 Bar
3 Kneipe

g_main_x_type
gastro_id | type_id
1 | 2
1 | 3
2 | 2

So. nun mach ich:

Code:
SELECT name FROM g_main AS l
INNER JOIN g_main_x_type AS m ON l.gastro_id = m.gastro_id
INNER JOIN g_type AS t ON t.type_id = m.type_id
WHERE t.type_name = 'Bar' OR t.type_name = 'Kneipe'
GROUP BY name


Zeigt er mir an:
• elFulanito
• Platz an der Sonne

wobei er nur anzeigen dürfte elFulanito, da Platz an der Sonne ja nur 2, also Bar ist, aber keine Kneipe. Ändere ich das OR in der Abfrage in AND zeigt er garnichts mehr an. Und mein Ziel war es ja jetzt eigentlich nur läden auszugeben bei denen mindestens alle Punkte (also Bar UND Kneipe) erfüllt sind.
  View user's profile Private Nachricht senden
 
Ähnliche Themen [MYSQL & PHP || GELÖST] -> Join-Abfrage
MySQL: Left JOIN Problem
[PHP&MySQL] Insert in 2 Tabellen
[PHP/MySQL] Tabellen zusammenführen
[PHP-MySQL] IF in SELECT, Tabellen Auswahl
[PHP/MySQL] Tabellen automatisch wiederherstellen?
Neues Thema eröffnen   Neue Antwort erstellen Seite: 1, 2  Weiter
MGi Foren-Übersicht -> Programmierung


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.