Wo ist mein Denkfehler in diesem SELECT

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

  • Wo ist mein Denkfehler in diesem SELECT

    Hi Leute,

    Mich plagt heute schon den halben Tag ein grasses Problem,
    bei dem ich nicht und nicht auf den Fehler komme.

    Was hab ich, was mach ich und was soll ausgegeben werden?

    Also:
    Ich habe 2 Tabellen.
    In der einen Tabelle habe ich Links zu RSS-Feeds
    und in der 2. habe ich dann jene User mit den abonnierten RSS-Feeds.

    So nun mache ich die funktionierende Abfrage - "Zeige mir jene Zeitungen die ich abonniert habe"
    PHP-Code:
    SELECT distinct rss_feeds.* FROM rss_feeds,rss_feeds_abo where 
                        
    (rss_feeds_abo.feed=rss_feeds.id) AND
                        
    rss_feeds_abo.nick='".$_SESSION['user']."' ORDER BY rss_feeds_abo.reihenfolge ASC 
    Wunderbar, das funktioniert und es werden meine 2 Zeitungen angezeigt.

    Nun möchte ich auch noch alle nicht abonnierten Zeitungen anzeigen.
    Also eigendlich ja ganz simple.
    Anstelle von rss_feeds_abo.feed=rss_feeds.id mach ich halt ein
    rss_feeds_abo.feed != rss_feeds.id

    PHP-Code:
    SELECT distinct rss_feeds.* FROM rss_feeds,rss_feeds_abo where 
                        
    (rss_feeds.id != rss_feeds_abo.feed) AND
                        
    rss_feeds_abo.nick='".$_SESSION['user']."' ORDER BY rss_feeds.anbieter ASC 
    Da zeigt er mir aber alle Datensätze aus der Ersten Tabelle und nicht die übrigen 6 die ich noch nicht abonniert habe.
    Wo ist da bitte der Hund begraben?

    Würde mich über einen Gedankenstoß sehr freuen.
    Danke und lg.
    Werner
    bidgo - Benzin im Blut
    Wir wollen Dich und Deine Karre
    Videoblog & Bilderblog zu verschiedenen Bereichen

  • #2
    wenn du noch nicht aboniert hast, dann dürfte das Feld nick wohlkaum deinen Namen enthalten, oder?

    Kommentar


    • #3
      Hi,

      ok ich muß noch ausholen und eine Zusatzinfo dazu abgeben.
      Wenn man das Erste mal die Seite öffnet und noch kein ABO hat,
      bekommt man die Liste der ganzen Zeitungen, wo man sich dann sein Abo auswählen kann.
      Da das ganze kostenlos ist kann die Liste immer kommen, solange er kein einziges ABO ausgewählt hat.
      ABO ist da sowieso der falsche Ausdruck - weils ja nur um Nachrichten der gewählten Zeitungen geht, die er in seinen Paparboy sieht.

      In diesem Status - also nix abonniert - gibt es eh nur die gesamtliste aller verfügbaren Zeitungen.

      Mein Problem ist dann sobald ich mind. ein Abo ausgewählt habe.
      Wie gesagt, die Liste der ausgewählten wird richtig angezeigt.
      Und zusätzlich will ich dem User auf der rechten Seite die Liste der noch möglichen Abos zeigen, die er noch nicht abonniert hat.

      Wenn ich also 2 Abos habe aus einen Gesamtdatenbestand von 8, dann sollen die 6 nicht abonnierten erscheinen in einer Liste.
      Er zeigt mir aber alle 8 Datensätze als nichtabonniert an - obwohl ich 2 abonniert habe.

      Leider versteh ich eben das Problem der Abfrage nicht.
      Denn lt. Logik muß ich statt = eben ein != machen und somit sollte es ja gehen.
      Aber wenn alles so einfach wäre, täte es kein Forum geben
      bidgo - Benzin im Blut
      Wir wollen Dich und Deine Karre
      Videoblog & Bilderblog zu verschiedenen Bereichen

      Kommentar


      • #4
        Original geschrieben von web4free

        Leider versteh ich eben das Problem der Abfrage nicht.
        Denn lt. Logik muß ich statt = eben ein != machen und somit sollte es ja gehen.
        Aber wenn alles so einfach wäre, täte es kein Forum geben
        ich weiss nicht woher du deine Logik nimmst, aber:

        A !=B AND C=D ist nicht gleich not (A=B AND C=D)

        Also überlege, was du ändern musst.

        Kommentar


        • #5
          Hi asp2php,

          Original geschrieben von asp2php

          Also überlege, was du ändern musst.
          Eigendlich dachte ich bis vor 2 Std. dass ich mich doch recht gut auskenne mit PHP und MYSQL.
          Für PHP mag es vielleicht passen aber nicht für MYSQL

          Ich hab jetzt noch nach einer anderen Sache gesucht im Forum - und zwar die Handhabung mit indexen.
          Jetzt merk ich erst was ich für ein Nudelaug ich wirklich bin.

          Aber gut, das ist ein anderes Thema.
          Also ich hätte es jetzt mal folgenderweise probiert:
          PHP-Code:
          SELECT distinct rss_feeds.* 
              
          FROM rss_feeds,rss_feeds_abo 
              WHERE NOT 
          (rss_feeds.id=rss_feeds_abo.feed AND rss_feeds_abo.nick='web4free'
              
          ORDER BY rss_feeds.anbieter ASC 
          Da zeigt er mir ebenfalls alle 8 vorhandenen Zeitungen.
          Ich will ja schlichtweg nur jene Zeitungen/Einträge sehen die ich noch nicht abonniert habe **heul**

          Ich komme mir so blöd vor, weil ich genau nix raffe.
          Schande über mich.

          Hilft es was, wenn ich ein minizip anhänge in dem der SQL-Dump ist und das PHP-Miniscript??
          Zuletzt geändert von web4free; 10.01.2006, 17:45.
          bidgo - Benzin im Blut
          Wir wollen Dich und Deine Karre
          Videoblog & Bilderblog zu verschiedenen Bereichen

          Kommentar


          • #6
            Original geschrieben von web4free

            Hilft es was, wenn ich ein minizip anhänge in dem der SQL-Dump ist und das PHP-Miniscript??
            nein

            der einfachste Weg ist die Bedingungen zu negieren, dann müsstest du theoretisch, das Gegenteil bekommen, was du bisher hast; und ich habe auch schon in meinem letzen Posting dir gegeben.

            Andererseits empfehle ich dir den Finger von CROSS JOIN zu lassen und stattdessen INNER/LEFT/RIGHT JOIN verwenden.

            Kommentar


            • #7
              Hi asp2php,

              Tja nach langen hin und her, hab ich nun doch eine Lösung gefunden.
              Eigendlich wußte ich diese Lösung ja schon vorher,
              wollte Sie aber nicht einsetzen weil ich dachte, dass Sie mehr Ressourcen brauchen würde als die von mir vorgeschlagene.

              Fakt ist:
              PHP-Code:
              $result=mysql_query("SELECT * FROM rss_feeds");
              while(
              $data=mysql_fetch_array($result))
              {
                  if(
              mysql_num_rows(mysql_query("SELECT feed FROM rss_feeds_abo 
                      WHERE feed='"
              .$data["id"]."' 
                      AND nick='"
              .$_SESSION['user']."'")) < 1) echo "&raquo;".$data["anbieter"]."<br>";

              ...dass ich mit der Abfrage zum Ziel komme und das mit weniger Ressourcenverbrauch.


              So hätte ich auf der Seite wo dieses Script in Einsatz kommt folgende Werte gehabt:
              Handler_read_rnd: 10
              Handler_read_rnd_next: 44

              Mit der jetztigen Lösung komme ich auf
              Handler_read_rnd: 2
              Handler_read_rnd_next: 34

              Das ist doch viel besser, oder nicht?

              Auf was ich bei der Sache jedenfalls gestossen bin ist, dass noch sehr viel Arbeit auf mich wartet, wenn ich diese Werte generell so klein wie möglich halten will.
              Zumindest stoße ich hier immer wieder auf den Begriff "Index",
              der für mich bis vor einen Monat für mich noch völlig fremd war.

              Gibt es da eigendlich eine Faustregel???
              Also zB. auf alle Spalten einen Index setzen die mit select spalte ..... aufgerufen werden?

              Bzw. worin liegt der Unterschied wenn ich lt. PhpMyAdmin zB. folgendes habe bei den Indizes:

              Name, Typ, Kardinalität, Feld
              nick, INDEX, 1, nick
              feed, INDEX, 3, feed

              bzw.
              Name, Typ, Kardinalität, Feld
              nick, INDEX, keine, nick
              ________________feed

              Die Linie ist nur damit die Spalte feed unterhalb von nick steht.
              Was ist hier besser?
              2 einzelne Indizes oder der eine mit den beiden Spalten?
              Das sind halt noch so die Dinge,
              von denen ich bisher nichts gewußt habe und dadurch auch nie eingesetzt habe.

              Würd mich freuen, wenn mir noch jemand zu den Indizes was sagen könnte.
              Vielen herzlichen Dank euch allen, die einen noch Unwissenden helfen.

              lg.
              Werner
              bidgo - Benzin im Blut
              Wir wollen Dich und Deine Karre
              Videoblog & Bilderblog zu verschiedenen Bereichen

              Kommentar

              Lädt...
              X