double join geht aber dritte bedingung nicht?

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

  • double join geht aber dritte bedingung nicht?

    PHP-Code:
    SELECT 
        COUNT
    (DISTINCT matches.id) AS count
    FROM
        parent_news_de 
    AS parent
    INNER JOIN
        matches_de 
    AS matches USING(id)
    LEFT JOIN
        news_history 
    AS history USING(id)
    WHERE matches.key_id IN(1) AND history.kd_id 28 AND history.id IS NULL ") ; 
    im prinzip klappt die abfrage -> nur mit der bedingung AND history.kd_id = 28 gehts sie nicht mehr? also nachdem dem inner join soll er mir nur die datensätze ausgeben die kd_id = 28 haben und nicht in history sind. ich vermute mal das die letzten zwei bedingungen sich gegenseitig ausschließen ??? was machen ich da nun .....

  • #2
    WICHTIGE DURCHSAGE AN ALLE: "Funktioniert nicht" ist noch immer KEINE Fehlerbeschreibung.

    ich vermute mal das die letzten zwei bedingungen sich gegenseitig ausschließen ??? was machen ich da nun ...
    Du bist wohl der einzige der das überprüfen kann. Warum machst du das nicht einfach mal!!! BTW: Wenn das so ist, solltest du mal drüber nachdenken!

    PHP-Code:
    WHERE matches.key_id IN(1
    so kann man IN natürlich auch missbrauchen!

    Kommentar


    • #3
      soorry ......

      das in ist ja nur als test so später kommen da natürlich mehr zahlen rein.... doppel sorry für die keine fehlernangabe ...

      ich krieg keinen error sondern das ergebnis ist 0 obwohl es definitv 7 sein muß -> mit anderen worten mit AND history.kd_id = 29 bedingung krieg ich immer 0 ?

      ich meinte ja mit ausschließen wenn ich auf null überprüfe mit left join kann ich denn da überhaupt noch eine andere bedingung so wie oben benutzen ....

      Kommentar


      • #4
        warum sollte man bei nem left join keine bedingungen einsetzen dürfen?

        poste mal tabellenstrucktur und deine definitiven 7 datensätze!

        Kommentar


        • #5
          Code:
          CREATE TABLE news_history (
            id int(8) unsigned NOT NULL default '0',
            kd_id int(8) unsigned NOT NULL default '0',
            datum datetime NOT NULL default '0000-00-00 00:00:00',
            KEY id (id,kd_id)
          ) TYPE=MyISAM;
          
          
          CREATE TABLE parent_news_de (
            id int(10) unsigned NOT NULL auto_increment,
            datum datetime NOT NULL default '0000-00-00 00:00:00',
            titel varchar(60) NOT NULL default '',
            PRIMARY KEY  (id)
          ) TYPE=MyISAM;
          
          CREATE TABLE matches_de (
            id int(10) unsigned NOT NULL default '0',
            key_id int(10) unsigned NOT NULL default '0',
            KEY match (key_id,id)
          ) TYPE=MyISAM;
          im prinzip simple .... jetzt die daten

          tabelle history:

          id_kd-id
          1 | 1
          2 | 2
          4 | 1
          2 | 3

          tabelle machtes

          id_key-id
          1 | 1
          1 | 2
          2 | 3
          3 | 2
          4 | 1
          4 | 2
          5 | 4
          5 | 5

          tabelle parent

          id_titel
          1 | titel xyz
          2 | titel xyz
          3 | titel xyz
          4 | titel xyz
          5 | titel xyz
          6 | titel xyz

          haben will ich:




          PHP-Code:
          SELECT 
              COUNT
          (DISTINCT matches.id) AS count
          FROM
              parent_news_de 
          AS parent
          INNER JOIN
              matches_de 
          AS matches ON parent.id matches.id
          LEFT JOIN
              news_history 
          AS history ON matches.id history.ids
          WHERE matches
          .key_id IN(1,4) AND history.kd_id 1  AND history.id IS NULL") ; 
          in diesem Beispiel muß das ergebnis folgendes sein

          IN(1,4) ergibt die (match) ids 1,4,5 der kd mit der kd-id 1 hat davon in der (history) 1,4. bleibt 5 übrig der count muß also 1 ergeben ... bei meiner variante kommt aber 0 raus .... uuuffff

          Kommentar


          • #6
            es wäre u.u. auch ratsam die demo-daten auch als INSERT-statement zu posten. meinst du, dass wir bock haben, das selber abzutippen? ich zumindest nicht.
            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


            Kommentar


            • #7
              Code:
              tabelle history
              INSERT INTO news_history VALUES (1, 1, '2004-02-05 16:56:31');
              INSERT INTO news_history VALUES (2, 2, '2004-02-05 16:56:31');
              INSERT INTO news_history VALUES (4, 1, '2004-02-05 16:56:31');
              INSERT INTO news_history VALUES (2, 3, '2004-02-05 16:56:31');
              
              tabelle machtes
              
              INSERT INTO matches_de VALUES (1, 1);
              INSERT INTO matches_de VALUES (4, 1);
              INSERT INTO matches_de VALUES (1, 2);
              INSERT INTO matches_de VALUES (3, 2);
              INSERT INTO matches_de VALUES (4, 2);
              INSERT INTO matches_de VALUES (2, 3);
              INSERT INTO matches_de VALUES (5, 4);
              INSERT INTO matches_de VALUES (5, 5);
              
              
              tabelle parent_news
              
              
              INSERT INTO parent_news_de  VALUES (1, '2004-02-03 14:57:39', 'titel xyz');
              INSERT INTO parent_news_de VALUES (2, '2004-02-03 14:57:39', 'titel xyz');
              INSERT INTO parent_news_de VALUES (3, '2004-02-03 14:57:39', 'titel xyz');
              INSERT INTO parent_news_de VALUES (4, '2004-02-03 14:57:39', 'titel xyz');
              INSERT INTO parent_news_de VALUES (5, '2004-02-03 14:57:39', 'titel xyz');
              INSERT INTO parent_news_de VALUES (6, '2004-02-03 14:57:39', 'titel xyz');
              ach so ... ja schuldigung, .... so zufrieden -> danke für euren hilfe

              Kommentar


              • #8
                Wieso ... das Ergebnis ist doch vollkommen korrekt ... die WHERE-Klause wird von Links nach Rechts ausgewertet

                "matches.key_id IN (1,4)" ergibt 3 Datensätze,
                "AND history.kd_id = 1" reduziert das Ergebnis auf 2 Datensätze, von denen keiner den Wert "history.id IS NULL" enthält.

                Du solltest Deine Fehler Schritt für Schritt analysieren ... ersetzt zunächst das COUNT() durch ein * und dann füge die Eingrenzungen der WHERE-Klause eine nach der anderen ein und beobachte was in der Ergebnismenge steht ... !!
                carpe noctem

                [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
                [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

                Kommentar


                • #9
                  ja das ist mir auch schon aufgefallen das ergebnis is durch die IS NULL bedingung 0.

                  matches.key_id IN (1,4)" ergibt 3 Datensätze
                  genau 1,4,5

                  soweit so gut mit der bedingung:

                  "AND history.kd_id = 1"
                  habe ich 1 und 4

                  was aber ich brauch ist die 5

                  -> genau die ids die in der matches_de auftauchen aber nicht in der news_history where kd_id = 1

                  ich dachte mit left join kriege ich genau diese .... ?

                  Kommentar


                  • #10
                    n abend, .... wollt mich nochmals in erinnerung bringen. vielleicht kann ja nochmal jemand einsteigen. siehe vorletzten post ... danke

                    Kommentar


                    • #11
                      hmm,

                      wenn du durch
                      Code:
                      AND history.kd_id = 1
                      genau die matches kriegst, die du nicht willst, wäre es für mich naheliegend
                      Code:
                      AND history.kd_id != 1
                      zu verwenden, ...
                      Die Zeit hat ihre Kinder längst gefressen

                      Kommentar


                      • #12
                        danke ... aber das geht nicht weil in news_history über hunderte von kd_ids drin ich brauch aber die datensätze die in history sind aber nicht in matches mit der kd_id in history als bedingung

                        Kommentar

                        Lädt...
                        X