Mehrfacheinträge mit Bedingungen finden

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

  • Mehrfacheinträge mit Bedingungen finden

    Hallo Community,

    irgendwie komme ich nach wirklich Stunden und Tagen des ausprobierens und googelns nicht weiter. Zumindest habe ich aber einen Ansatz.

    Ich will Einträge in der Datenbank finden, die nach ein paar Bedingungen immernoch Mehrfach vorkommen.

    Also z.B.

    Tabelle haken
    id, intid, projektid, b1d1v, kw
    1, 5, 8, 1, 3
    2, 5, 8, 0, 3
    3, 6, 7, 1, 3
    4, 5, 7, 1, 3
    5, 9, 8, 0, 4
    6, 6, 8, 1, 3
    7, 5, 9, 1, 3
    8, 2, 8, 1, 4
    8, 2, 2, 1, 4

    Ich will jetzt alle intid haben, die
    a) b1d1v=1
    b) in der gleichen kw stecken
    c) nach diesen Bedingungen noch mehrfach vorkommen:

    Also intid 5 in der kw 3 mit b1d1v=1 kommt 2x vor, den möchte ich haben:
    1, 5, 8, 1, 3
    7, 5, 9, 1, 3
    und intid 2 in der kw 4 mit b1d1v=1 kommt auch 2x vor, den möchte ich ebenfalls haben:
    8, 2, 8, 1, 4
    8, 2, 2, 1, 4

    Meine Ausgabe sollte also am Ende sein:
    1, 5, 8, 1, 3
    7, 5, 9, 1, 3
    8, 2, 8, 1, 4
    8, 2, 2, 1, 4

    Ich krieg es einfach nicht hin. Hab es mit verschachtelten While-Schleifen versucht und so weiter.
    Mein neuster Ansatz funzt auch nicht:

    PHP-Code:
    SELECT idintidprojektidblockb1d1vkw
    FROM haken
    WHERE intid IN 
    (SELECT intid FROM haken GROUP BY intid HAVING count(intid) >1)
    AND 
    kw IN (SELECT kw FROM haken GROUP BY kw HAVING count(kw) >1)
    AND 
    b1d1v=1 ORDER BY id DESC 
    Also wenn ich nur mehrfache intid haben will, wo b1d1v=1 ist es kein Problem.
    Aber mit der zusätzlichen Bedingung, daß davon wiederum nur die angezeigt werden sollen, die eine mehrfache kw haben ist es Essig.
    Wo ist mein Denkfehler?
    So zeigt er jedenfalls zu viel an...

    Grüße,
    Coni
    Gruß, Coni
    ~~ codito ergo sum - ich code, also bin ich! ~~

  • #2
    Ich bin der Sache nun etwas näher gekommen:

    PHP-Code:
    SELECT idintidprojektidblockb1d1vkw FROM haken WHERE intid IN (SELECT intid FROM haken WHERE b1d1v=1 GROUP BY intid,kw HAVING count(intid) >1) AND b1d1v=1 GROUP BY intid ORDER BY id DESC 
    Ergibt:

    Ergebnisse:3

    436 - 23 - 8 - 1 - 1 - 3
    347 - 28 - 8 - 1 - 1 - 3
    155 - 20 - 6 - 1 - 1 - 3

    Da fehlen jetzt aber glaub ein paar Ergebnisse, muß das noch prüfen...
    Gruß, Coni
    ~~ codito ergo sum - ich code, also bin ich! ~~

    Kommentar


    • #3
      Zitat von Coniaric Beitrag anzeigen
      Ich will Einträge in der Datenbank finden, die nach ein paar Bedingungen immernoch Mehrfach vorkommen.

      Also z.B.

      Tabelle haken
      id, intid, projektid, b1d1v, kw
      1, 5, 8, 1, 3
      2, 5, 8, 0, 3
      3, 6, 7, 1, 3
      4, 5, 7, 1, 3
      5, 9, 8, 0, 4
      6, 6, 8, 1, 3
      7, 5, 9, 1, 3
      8, 2, 8, 1, 4
      8, 2, 2, 1, 4

      Ich will jetzt alle intid haben, die
      a) b1d1v=1
      b) in der gleichen kw stecken
      c) nach diesen Bedingungen noch mehrfach vorkommen:
      Nach Deiner Beschreibung ist auch intid = 6 mit gesucht, oder?

      Was für eine Datenbank? Folgendes geht in PG ab 8.4:


      Um nur die intid zu bekommen geht dies:

      Code:
      test=*# select * from haken ;
       id | intid | pid | b1 | kw
      ----+-------+-----+----+----
        1 |     5 |   8 |  1 |  3
        2 |     5 |   8 |  0 |  3
        3 |     6 |   7 |  1 |  3
        4 |     5 |   7 |  1 |  3
        5 |     9 |   8 |  0 |  4
        6 |     6 |   8 |  1 |  3
        7 |     5 |   9 |  1 |  3
        8 |     2 |   8 |  1 |  4
        8 |     2 |   2 |  1 |  4
      (9 rows)
      
      test=*# select distinct intid from (select *, row_number() over(partition by kw) kw_count, row_number() over (partition by intid) intid_count from haken where b1 = 1) foo where kw_count > 1 and intid_count > 1;
       intid
      -------
           2
           5
           6
      (3 rows)

      Kommentar


      • #4
        "Nach Deiner Beschreibung ist auch intid = 6 mit gesucht, oder?"

        Ja, richtig!

        Hab es jetzt etwas anders gelöst, mit einer Schleife außenrum (vielleicht nicht ganz elegant und performant),

        PHP-Code:
        SELECT idintidprojektidblockb1d1vkw
        FROM haken WHERE intid IN 
        (SELECT intid FROM haken WHERE b1d1v=AND kw='$kw' GROUP BY intid HAVING count(intid) >1) AND b1d1v=AND kw='$kw' GROUP BY intid ORDER BY id DESC 
        und außenrum eine Abfrage, die Tag, Monat und kw sucht.

        Aber Dein Lösungsansatz sieht mir deutlich eleganter aus, werd mich damit auch nochmal beschäftigen, danke!
        Gruß, Coni
        ~~ codito ergo sum - ich code, also bin ich! ~~

        Kommentar


        • #5
          Zitat von Coniaric Beitrag anzeigen

          Hab es jetzt etwas anders gelöst, mit einer Schleife außenrum (vielleicht nicht ganz elegant und performant),
          SQL in Schleifen ist selten eine gute Idee.

          und außenrum eine Abfrage, die Tag, Monat und kw sucht.
          Klingt, als ob Du diese Werte für ein Datum in getrennten Feldern speicherst. Ganz schlecht.

          Aber Dein Lösungsansatz sieht mir deutlich eleganter aus, werd mich damit auch nochmal beschäftigen, danke!
          Bitte.

          Kommentar

          Lädt...
          X