Hallo Leute,
ich habe folgende Abfrage in einem PHP-Skript, die seit einem Update des
MySQL-Servers durch meinen Hosting-Anbieter nicht mehr funktioniert:
SELECT
mitglied.titel as titel,
mitglied.vorname as vorname,
mitglied.zusatz as zusatz,
mitglied.nachname as nachname,
mitglied.spitzname as spitzname,
mitglied.id as mid
FROM
mitglied
WHERE
(mitglied.nachname like '%$search%' OR
mitglied.vorname like '%$search%' OR
mitglied.spitzname like '%$search%') AND
(SELECT
mitglied_status.status
FROM
mitglied, mitglied_status
WHERE
mitglied.id = mitglied_status.mitglied AND
mitglied_status.mitglied = mid
ORDER BY
mitglied_status.datum DESC
LIMIT 1) IN ($status)
ORDER BY
mitglied.nachname,
mitglied.vorname ASC
Im Prinzip sucht die Abfrage alle Mitglieder aus einer Tabelle, deren
Mitgliedsstatus in $status enthalten ist und deren Nachname, Vorname
oder Spitzname den Substring $search enthält.
Da ein Mitglied mehrere Mitglieds-Statusse haben kann (1:n-Beziehung),
sind Mitglieder und Statusse über eine extra Tabelle verknüpft, diese
nennt sich mitglied_status.
Das Problem dieser verschachtelten Abfrage ist nun, daß das Feld "mid"
in der inneren Abfrage nicht mehr bekannt ist. Ich muß irgendwie die
Mitglieds-ID aus der Hauptabfrage in der Nebenabfrage zur Verfügung
haben. In der alten Version von MySQL ging das problemlos, die Abfrage
hat so funktioniert. Wie macht man das jetzt vernünftig?
Hallo,
Du musst den beiden Tabellen mitglied jeweils einen Alias gebe, also
select a.titel, a..... from mitglied a
....(select b.....from mitglieg b
where .... = a.id
Kenne aber eher Oracle und MS-Sql....
Gruss,
Michael
Ich hoffe es ist kein Fehler drin, und ich habe nichts übersehen
SELECT distinct
m.titel as titel,
m.vorname as vorname,
m.zusatz as zusatz,
m.nachname as nachname,
m.spitzname as spitzname,
m.id as mid
FROM
mitglied m
join mitglied_status s
on s.mitglied = m.mid
WHERE
(mitglied.nachname like '%$search%' OR
mitglied.vorname like '%$search%' OR
mitglied.spitzname like '%$search%')
and s.Status in ( $status )
ORDER BY
mitglied.nachname,
mitglied.vorname ASC
Danke euch beiden... Leider geht's so nicht. Das Problem ist folgendes: Tabelle Mitglied: 1, Hans, Wurst, Würstchen, ... 2, Gertrude, Heckenpenner, Trudchen, ... Dann die Tabelle mit der Zuordnung Mitglieds-Status zu Mitglied, wobei die komplette Historie mit abgespeichert ist, die das Mitglied je hatte. Abgespeichert ist der Primärschlüssel von Mitglied (Mitgliedsnummer), der Primärschlüssel vom Status (Status-ID) und das Datum, ab wann das Mitglied diesen Status hatte. Also für Status 1 = Juniormitglied, 2 = Seniormitglied, 3 = Fördermitglied könnte die Tabelle so aussehen: Tabelle mitglied_status: 1, 2, 27.12.2005 1, 3, 01.09.2007 2, 1, 24.04.1971 2, 2, 20.03.1982 Ich brauche jetzt bei meiner Abfrage den aktullen Status des Mitglieds. Deshalb die innere Abfrage, wo ich absteigend nach Datum sortiere und die Anzahl der Einträge auf 1 limitiere. So kriege ich den letzten Eintrag für das betreffende Mitglied, also den aktuellen Status des Mitglieds. Wollte ich jetzt Seniormitglieder suchen, deren Spitzname "chen" enthält, würde ich also das Trudchen aus dem o.g. Beispiel finden, nicht aber Würstchen, denn der war zwar mal Seniormitglied, ist jetzt aber nur noch Fördermitglied. Gar nicht so einfach. Ich brauche das aber möglichst in EINER Abfrage und vor allem kann ich leider an der Datenbankstruktur nichts ändern, weil auch andere Programme auf die Datensätze zugreifen. Danke!
gut jetzt habe ich das Problem verstanden (denke ich). 2.Versuch:
SELECT distinct
m.titel as titel,
m.vorname as vorname,
m.zusatz as zusatz,
m.nachname as nachname,
m.spitzname as spitzname,
m.id as mid
FROM
mitglied m
join mitglied_status s
on s.mitglied = m.mid
join ( select
mitglied,
max(Datum) as Datum
from
mitglied_status
group by mitglied
) s2
on s2.mitglied = m.mitglied
and s.Datum = s2.Datum
WHERE
(mitglied.nachname like '%$search%' OR
mitglied.vorname like '%$search%' OR
mitglied.spitzname like '%$search%')
and s.Status in ( $status )
ORDER BY
mitglied.nachname,
mitglied.vorname ASC
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.