Anzeige:
Ergebnis 1 bis 10 von 10

Thema: "negativer" INNER JOIN ?!

  1. #1
    Registrierter Benutzer
    Registriert seit
    07.10.2003
    Ort
    München
    Beiträge
    29

    "negativer" INNER JOIN ?!

    Hallo!

    Ich habe folgendes Problem:

    Es handelt sich um eine MYSQL-Datenbank mit folgenden Tabellen (Meine eigentliche Datenbank ist sehr viel Komplexer, folgendes als Beispiel):

    Tabelle: Kategorien
    Felder: Name, ID

    Tabelle: Artikel
    Felder: Titel, ID, Inhalt, Kategorie

    Wenn ich Alle Artikel haben möchte, die in einer Kategorie sind, verwende ich folgende Abfrage:
    Code:
    SELECT Artikel.*
    FROM Artikel
    INNER JOIN Kategorien (Kategorien.ID = Artikel.Kategorie)
    Wenn nun ein neuer Artikel angelegt wird und keine Kategorie ausgewählt wird, ist der Wert für 'Kategorie' im jeweiligen Datensatz 0. Dadurch kann ich dann einfach abfragen, welche Artikel in keiner Kategorie sind:
    Code:
    SELECT * FROM Artikel WHERE Kategorie=0
    Das Problem ist nur, dass es sein kann, dass eine Kategorie nachträglich gelöscht wird. Diejenigen Datensätze, die in der Kategorie enthalten waren werden nicht gelöscht und sind zukünftig keiner Kategorie zugeordnet!
    Desshalb ist die 2. Abfrage nicht sinnvoll, da hier nur diejenigen Artikel ausgewählt wurden, die von Anfang an keiner Kategorie zugeordnet waren. Ich möchte aber ALLE Datensätze abfragen, die keiner Kategorie zugeordnet sind!

    Wie funktioniert das?

    sg, Fabian

    PS: eigentlich geht es um eine sehr viel komplexere Abfrage, die um das oben beschriebene erweitert werden soll

    Beispiel:

    Code:
    SELECT V.*
    FROM veranstaltungen AS V
    INNER JOIN termine AS T
    ON (V.ID = T.veranstaltung)
    WHERE T.ergt=0
    AND V.p_kategorie=20
    AND T.`erster_termin`>1141167600
    AND T.`erster_termin`<1155679200
    GROUP BY V.ID
    ORDER BY T.`erster_termin`
    Geändert von inner.glow (14-02-2006 um 17:11 Uhr)

  2. #2
    Registrierter Benutzer Avatar von mwanaheri
    Registriert seit
    28.10.2003
    Ort
    Bayreuth
    Beiträge
    569
    Wenn ich dein Beispiel richtig verstehe, gibt es zwei Möglichkeiten, mit denen ein Artikel keiner Kategorie zugeordnet sein kann:
    1) Kategorie = 0, dabei ist 0 die Dummykategorie
    2) kategorie = null, das scheint beim Löschen zu passieren.

    1) erwischst du natürlich mit kategorie = 0, für 2) geht nur kategorie is null.
    willst du also beide haben, sollte es mit
    where kategorie = 0 or kategorie is null
    gehen. Ich nehme an, auch unter mysql.
    Das Ziel ist das Ziel.

  3. #3
    Registrierter Benutzer
    Registriert seit
    07.10.2003
    Ort
    München
    Beiträge
    29
    Nein. Wenn die Kategorie 2 gelöscht wird, bleibt im Artikel-Datensatz der Wert 2 für die Kategorie erhalten.

    Ich möchte in meine Abfrage für jeden relevanten Datensatz in der Artikel-Tabelle prüfen, ob die angegebene Kategorie noch existiert.

    sg.

  4. #4
    Registrierter Benutzer Avatar von mwanaheri
    Registriert seit
    28.10.2003
    Ort
    Bayreuth
    Beiträge
    569
    Oh, das hatte ich falsch verstanden. Also:
    die Kategorie wird gelöscht, aber ihre ID bleibt in der Artikeltabelle vorhanden.
    Die Artikel, die auf eine nicht vorhandene Kategorie verweisen solltest du mit

    select artikel.id from artikel
    where artikel.kategorie not in (select id from kategorie);

    zu packen kriegen. Bei einer Fremdschlüsselbeziehung sollte es eigentlich nicht möglich sein, eine Kategorie zu löschen, auf die in der artikeltabelle verwiesen wird. So weit ich weiß kann mySQL das inzwischen auch. Wenn man dann löschen will, muss man das kaskadierend tun, so dass automatisch alle Einträge aus der Artikeltabelle gelöscht werden, die auf die zu löschende Kategorie verweisen.
    Das Ziel ist das Ziel.

  5. #5
    Registrierter Benutzer Avatar von elrond
    Registriert seit
    04.10.2001
    Ort
    potsdam
    Beiträge
    881
    ich glaube du suchst danach:
    Code:
    SELECT Artikel.*
    FROM Artikel LEFT JOIN Kategorien  on Kategorien.ID = Artikel.Kategorie
    where karegorien.id is null
    ich kanns leider grade nicht ausprobieren und beunutz es eher selten. sollte aber gehen
    "Um die Welt zu ruinieren, genügt es, wenn jeder seine Pflicht tut." (Winston Churchill)

  6. #6
    Registrierter Benutzer
    Registriert seit
    07.10.2003
    Ort
    München
    Beiträge
    29
    Hi!

    Die Abfrage von mwanaheri war das, was ich gesucht hatte.

    Andieser Stelle vielen Dank!

  7. #7
    Registrierter Benutzer Avatar von elrond
    Registriert seit
    04.10.2001
    Ort
    potsdam
    Beiträge
    881
    hossa, kann die mysql mittlerweile subselects ?!?
    "Um die Welt zu ruinieren, genügt es, wenn jeder seine Pflicht tut." (Winston Churchill)

  8. #8
    Registrierter Benutzer
    Registriert seit
    07.10.2003
    Ort
    München
    Beiträge
    29
    Ja, anscheinenend am MYSQL 4.1 - Bei 4.0 funktionierts noch nicht ------ Was mich wieder um einiges zurückwirft weil auf meinem Server Mysql 4.0 läuft NEEIIIN

    Naja... ICh werd dann mal nach einer anderen Lösung suchen müssen... :-(

    sg. Fabian

  9. #9
    Registrierter Benutzer Avatar von mwanaheri
    Registriert seit
    28.10.2003
    Ort
    Bayreuth
    Beiträge
    569
    Nun, ohne subselect könnte das klappen:

    select * from artikel
    left join kategorien on artikel.kategorie = kategorien.id
    where kategorien.kategorie is null;

    ok, eigentlich brauchst du nur die id vom Artikel, aber in diese Richtung würde ich gehen.

    ups, sehe gerade, dass Elrond das schon vorgeschlagen hatte.
    Geändert von mwanaheri (16-02-2006 um 20:36 Uhr)
    Das Ziel ist das Ziel.

  10. #10
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    Zitat Zitat von elrond
    hossa, kann die mysql mittlerweile subselects ?!?
    also die 5.1 kann sie sogar schon richtig gut

    folgende tabelle angenommen:
    Code:
    [reihe]
    2
    2
    4
    5
    7
    8
    8
    ziel ist es nun aus dieser spallte alle doppelten zahlen zu bekommen UND wenn lücken existieren, dann soll die nächstkleinere ausgegeben werden
    Code:
    select distinct a.reihe from nummern a
    where exists (select 1 from nummern b where a.reihe = b.reihe group by b.reihe having count(1) > 1)
    or not exists (select 1 from nummern c where c.reihe+1 = a.reihe)
    order by a.reihe
    greetz
    Geändert von quinte17 (17-02-2006 um 11:20 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •