Ausschlusskriterien innerhalb einer Tabelle

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Ausschlusskriterien innerhalb einer Tabelle

    Nach erfolglosem Suchen und Recherchieren komme ich nicht vom Schlauch herunter.

    Ausgangssituation Tabelle temp mit 4 Datensätzen:

    CREATE TABLE `temp` (
    `krid` varchar(10) NOT NULL default '',
    `katid` varchar(10) NOT NULL default ''
    ) TYPE=MyISAM;

    INSERT INTO `temp` (`krid`, `katid`) VALUES
    ('kr1', '1'),
    ('kr2', '2'),
    ('kr3', '1'),
    ('kr3', '3');

    Ich möchte alle Datensätze selektieren, die nicht in katid 3 enthalten sind. Das Problem liegt bei kr3, das in katid 1 und 3 enthalten ist. Sozusagen ist katid ein Ausschlußkriterium und daher soll bei einem SELECT auch kr3 nicht ausgegeben werden. Habe nun schon alles mögliche probiert mit LEFT JOINS, INNER JOINS etc., hat alles nicht geklappt. Weiß ehrlich auch nicht genau wie ich hier weiter vorgehen soll.

    Subqueries sind leider bei Mysql 4.0.27 nicht erlaubt.

    Als Ergebnis erwarte ich
    krid | katid
    kr1 | 1
    kr2 | 2

    Helft mir! Wäre super, wenn wir die Lösung hinbekommen.

  • #2
    Habe nun schon alles mögliche probiert mit LEFT JOINS, INNER JOINS etc., hat alles nicht geklappt. Weiß ehrlich auch nicht genau wie ich hier weiter vorgehen soll.
    Hmm, dann zeig doch mal deine Ansätze. So wie ich das sehe, reden wir über nur eine Tabelle und deswegen sind JOINs hier fehl am Platz.

    Was du genau haben willst, habe ich leider auch noch nicht ganz verstanden. Du willst alle Daten habe, wo katid != 3? Und was ist jetzt mit krid gleich 1 oder 3. Krid darf auch nicht 3 sein? Das habe ich nicht genau verstanden.

    Ahja, warum sind deine ids eigentlich vom Typ varchar? Warum geht INT nicht?
    Assembler ist eine Methode,
    Programme, die zu langsam laufen,
    so umzuschreiben,
    dass sie überhaupt nicht mehr laufen.

    Kommentar


    • #3
      Sorry für das Varchar, natürlich sind die Daten in der Live-DB als INT. Habe das Beispiel soweit vereinfacht und die 4 Datensätze nur mal als Beispiel eingegeben.

      Hier die Korrektur:
      CREATE TABLE `temp` (
      `krid` int(11) NOT NULL default '0',
      `katid` int(11) NOT NULL default '0'
      ) TYPE=MyISAM;


      INSERT INTO `temp` (`krid`, `katid`) VALUES
      (1, 1),
      (2, 2),
      (3, 1),
      (3, 3);

      Und ja, es handelt sich hierbei nur um eine Tabelle.

      Mein Ziel in Worten:
      krid 3 ist sowohl katid 3 als auch katid 1 zugeordnet und soll deshalb in der Ergebnismenge nicht angezeigt werden, da katid = 3 ein Ausschlusskriterium sein soll. Wenn ich jetzt aber über einen
      SELECT krid FROM temp WHERE katid <> '3' selektiere, bekomme ich 3 Datensätze inklusive krid 3 angezeigt.

      Meine Joins kann ich nicht präsentieren, es hat einfach nicht geklappt. Mir fehlt einfach der Denkansatz, wie ich hier das Ausschlusskriterium definiere.

      Ich hoffe, es war einigermassen verständlich.

      Kommentar


      • #4
        Meine Joins kann ich nicht präsentieren, es hat einfach nicht geklappt.
        Natürlich klappen Joins nicht, da Joins, wie der Name schon sagt, 2 oder mehr Tabellen zusammenführen. Bei lediglich einer Tabelle macht das keinen Sinn.

        Code:
        SELECT krid, katid FROM temp WHERE krid != 3 AND katid != 3
        Zuletzt geändert von TheFish511; 08.09.2008, 18:36.
        Assembler ist eine Methode,
        Programme, die zu langsam laufen,
        so umzuschreiben,
        dass sie überhaupt nicht mehr laufen.

        Kommentar


        • #5
          Natürlich klappen Joins nicht, da Joins, wie der Name schon sagt, 2 oder mehr Tabellen zusammenführen. Bei lediglich einer Tabelle macht das keinen Sinn.
          So ein Unsinn. Du kannst selbstverständlich Die Tabelle mit sich selbst Joinen!

          Kommentar


          • #6
            Hmm stimmt, hast recht. Hatte ich davor noch nie gesehen ... Man lernt eben nie aus.
            Assembler ist eine Methode,
            Programme, die zu langsam laufen,
            so umzuschreiben,
            dass sie überhaupt nicht mehr laufen.

            Kommentar


            • #7
              Danke für den Vorschlag.

              Code:
              SELECT krid, katid FROM temp WHERE krid != 3 AND katid != 3
              Das führt zwar in diesem Beispiel zum Ergebnis, ist aber nicht zufrieden stellend, da krid unbekannt ist. krid = 3 scheidet nur aus, da es auch der katid = 3 zugeordnet ist.

              Ein weiteres Beispiel zur Verdeutlichung.

              INSERT INTO `temp` (`krid`, `katid`) VALUES
              (1, 1),
              (2, 2),
              (3, 1),
              (3, 3),
              (4, 2),
              (5, 3),
              (6, 1),
              (6, 2),
              (6, 3),
              (7, 1),
              (8, 1),
              (8, 2),
              (9, 3),
              (10, 1),
              (10, 3),
              (11, 1);

              krid 3, 5, 6, 9, 10 sind in der Tabelle irgendwann der katid 3 zugeordnet, diese sollen also raus:

              SELECT * FROM `temp` WHERE `katid` = 3

              Jetzt muss ich irgendwie der Tabelle temp beibringen, diese Ergebnismenge der krids "rauszufiltern".

              Any Ideas?

              Kommentar


              • #8
                Falls es weiter hilft, hier meine Bemühungen, was ich bisher getestet habe:

                Code:
                SELECT * FROM `temp` t1 LEFT JOIN temp t2 ON t1.katid = 3
                SELECT krid FROM `temp` t1 WHERE t1.katid = 3 NOT IN t1.katid
                => Error

                Code:
                SELECT krid, COUNT(t1.katid<>3) AS katid3counter FROM `temp` t1 GROUP BY t1.krid => t1.katid<>3
                => scheint nicht ausgewertet zu werden

                Code:
                SELECT krid, IF(katid=3, 'WAHR', 'FALSCH') AS katid3counter FROM `temp` t1 GROUP BY t1.krid
                => GROUP BY verhindert Auflistung der gefundenen Elemente

                Code:
                SELECT krid, COUNT(IF(katid=3, 'WAHR', 'FALSCH')) AS katid3counter FROM `temp` t1 GROUP BY t1.krid
                => COUNT führt nicht zum Ergebnis

                Code:
                SELECT krid, SUM(IF(katid=3, '1', '0')) AS katid3counter FROM `temp` t1 WHERE katid3counter < 1 GROUP BY t1.krid
                => WHERE Ausdruck, katid3counter unknown column

                Ohne dem katid3counter im where-Klause bin ich hier schon ganz nah an der Lösung. Doch die Alias-Ausgabe-Spalte darf nicht im where-Klause verwendet werden...

                Code:
                SELECT krid, SUM(IF(katid=3, '1', '0')) AS katid3counter FROM `temp` t1 WHERE SUM(IF(katid=3, '1', '0')) < 1 GROUP BY t1.krid
                => #1111 - Invalid use of group function

                Vielleicht fällt Euch noch was ein?

                Kommentar


                • #9
                  Okay, bin nun zur Lösung vorgestossen. In der Having Klausel sind die Ausgabefelder abfragbar:

                  Code:
                  SELECT krid, SUM(IF(katid=3, '1', '0')) AS katid3counter FROM `temp` t1 GROUP BY t1.krid HAVING katid3counter < 1
                  Hätte niemals gedacht, dass es so kompliziert ist.
                  Falls jemand noch Ideen hat, den Ausdruck zu optimieren, gerne
                  Würde mich echt freuen, wenn Ihr noch Verbesserungen zu diesem Code habt.

                  Vielen Dank schon mal fürs "miträtseln".

                  Kommentar

                  Lädt...
                  X