kleiner heiner: mysql abfrage-prob

hi hi!

ich hab zu später stund' noch n kleines mysql abfrage-prob. ich hoffe da ist nochjemend mit nem tipp.
wie kann man alle id's extrahieren die den inhalt A und C haben?

id|inhalt
1|A
1|B
1|C
2|B
2|A
3|C
3|A

-> würde id 1 und 3 ergeben

mfg
heiner

  1. Hallo,

    $abfrage = "SELECT * FROM tabelle WHERE inhalt IN(A, C)";
    $ergebnis = mysql_query($abfrage);
    while($row = mysql_fetch_object($ergebnis))
       {
    echo "$row->id";

    }

    MFG
    Andavos

    --
    http://www.rpgcommunity.de/clanwissen/index.php Webdesign, PHP, Clan-Aufbau und mehr
    1. hi andavos,

      vielen dank für die schnelle hilfe, das funktioniert wunderbar

      heiner

    2. nochmal das gleiche prob, aber zusätzlich soll die reihenfolge A -> C sein, nicht C -> A

      id|inhalt|auto_id
      1|A|1
      1|B|2
      1|C|3
      2|B|4
      2|A|5
      3|C|6
      3|A|7

      ergibt id 1

      ich hoffe ihr habt eine idee??!

      heiner

      1. Hallo,

        so (a->c)

        $abfrage = "SELECT * FROM tabelle WHERE inhalt IN(A, C) ORDER BY inhalt ";

        bzw (c->a).

        $abfrage = "SELECT * FROM tabelle WHERE inhalt IN(A, C) ORDER BY inhalt DESC";

        $ergebnis = mysql_query($abfrage);
        while($row = mysql_fetch_object($ergebnis))
           {
        echo "$row->id";

        }

        MFG
        Andavos

        --
        http://www.rpgcommunity.de/clanwissen/index.php Webdesign, PHP, Clan-Aufbau und mehr
        1. hi andavos,

          ich meinte etwas anderes, ich versuche es deutlicher zu erklären: die abfrage soll nur auf inhalt A vor C matchen, d.h. wenn C vor A in der tabelle steht, match die abfrage nicht.

          (wenn die auto_id von A kleiner ist als die von C dann matcht die abfrage.)

          id|inhalt|auto_id
          1|A|1
          1|B|2
          1|C|3
          2|B|4
          2|A|5
          3|C|6
          3|A|7

          ergibt nur die id 1, weil bei id 3 C vor A steht.

          ich hoffe die erklärung ist besser...

          heiner

          1. yo,

            ich meinte etwas anderes, ich versuche es deutlicher zu erklären: die abfrage soll nur auf inhalt A vor C matchen, d.h. wenn C vor A in der tabelle steht, match die abfrage nicht.

            das ist etwas unglücklich ausgedrückt. die reihenfolge wie datensätze in der tabelle stehen ist unsortiert, das heisst eine höhere id kann vor einer niedrigen stehen.

            (wenn die auto_id von A kleiner ist als die von C dann matcht die abfrage.)

            das ist schon deutlicher, da diese aussage sich auf die werte bezieht und nicht auf deren position in der tabelle.

            id|inhalt|auto_id
            1|A|1
            1|B|2
            1|C|3
            2|B|4
            2|A|5
            3|C|6
            3|A|7

            ergibt nur die id 1, weil bei id 3 C vor A steht.

            ganz nachvollziehen kann ich die logik aber immer noch nicht, die du abbilden willst. wo steht den bei id 3 ein C vor dem A, kannst du noch einmal in anderen worten ausdrücken, welche datensätze ausgewählt werden sollen ?

            Ilja

            1. hi ilja

              es sollen alle "ids" gefunden werden, die den "inhalt" A und C beinhalten, in der reihenfolge A -> C (bei "id" 1 ist das so), aber nicht die reihenfolge C -> A (bei "id" 3 ist das so). oder anders: wenn die auto_id von A kleiner ist als die von C dann matcht die abfrage.  (es soll allerdings jede beliebige reihenfolge abgefragt werden können.)
              folgende tabelle:

              id|inhalt|auto_id
              1|A|1
              1|B|2
              1|C|3

              2|B|4
              2|A|5

              3|C|6
              3|A|7

              gewünschtes ergebnis: "id" 1
              ich hoffe das war etwas verständlicher.

              teillösung:
              SELECT id FROM tabelle WHERE inhalt IN("A","C") GROUP BY id HAVING COUNT(id) >= 2
              jetzt muss noch die reihenfolge A->C beachtet werden...

              gruß
              heiner

              1. yo Heiner,

                jetzt ist auch mir ein licht aufgegangen. das hört sich nach einem self join an, da du ja unterschiedliche datensätze der gleichen tabelle in beziehung bringen musst.

                SELECT DISTINCT tab1.id
                FROM tabelle AS tab1, tabelle AS tab2
                WHERE tab1.id=tab2.id
                AND tab1.inhalt='A' AND tab2.inhalt='C'
                AND tab1.auto_id > tab2.auto_id;

                nicht ausprobiert und bin mir selbst ein wenig unsicher, ob das geht. aber versuch das mal.

                Ilja

                1. yo,

                  abgeschickt und gleich einen fehler gemacht. mach mal in der letzten zeile lieber ein kleiner als größer, also:

                  AND tab1.auto_id < tab2.auto_id;

                  Ilja

                2. SELECT DISTINCT tab1.id
                  FROM tabelle AS tab1, tabelle AS tab2
                  WHERE tab1.id=tab2.id
                  AND tab1.inhalt='A' AND tab2.inhalt='C'
                  AND tab1.auto_id < tab2.auto_id;

                  1A! funktioniert in beide richtungen (A->C oder C->A). danke ilja! ich muss mich in zukunft mehr mit self-joins (hab davon vorher nie was gehört :-) ) beschäftigen...

                  gruß
                  heiner