Einfache Freage zu mehreren AND kombinationen

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

  • Einfache Freage zu mehreren AND kombinationen

    Hallo,

    ich habe folgenden sql code

    PHP-Code:
    SELECT FROM tabelle WHERE id AND (name != "foo" AND nummer != 10001
    ich möchte alle zeilen ausgeben die dem entsprchen, aber die klammern von "name != "foo" AND nummer != 10001" werden irgendwie ignoriert so das es nicht als kombination angesehen wird..

    meite tabelle:

    id ........ name .......... nummer
    1...........foo...............10001
    1...........boo...............10001
    1...........boo...............10002

    aus der tabelle würdern dann theoretisch nur die letzten zwei einträge ausgegeben.

    irgendwie erscheint mir mein code schon richtig, aber funz iwie nicht und ich hab grad kp was ich daran anders machen soll...

    Danke schonmal!
    Zuletzt geändert von BananaJo; 08.07.2011, 21:10.

  • #2
    Du verwendest IDs mehrmals???????

    Oder ist das nur eine Fantasietabelle, die nichts mit dem tatsächlichen Problem zu tun hat?

    Zeig einen Datenbankdump, bei dem sich dieses Problem nachstellen lässt.

    Kommentar


    • #3
      die tabelle ist nur ein beispiel.. ich habe da eine spalte mit ids aus einer anderen tabelle die auch mehrmals vorkommen.

      ist denn meine herangehenweise so richtig oder hab ich da schon nen denkfehler drinne den ich absolut nicht sehe... ??

      Kommentar


      • #4
        Die Klammer kannst du dir komplett sparen, X AND ( Y AND Z ) das selbe wie X AND Y AND Z ist. Genauso wie 1 + (2 + 3) das selbe wie 1 + 2 + 3 ist.

        Ansich seh ich bei der Abfrage keinen Fehler. Deshalb vermute ich den Fehler in den Daten, also zeig bitte einen (kleinen) Datenbankdump, bei dem sich dieser Fehler reproduzieren lässt.

        Kommentar


        • #5
          Also die klammern sollen die beiden AND's zusammenfassen.
          Oder funktioniert soetwas nur mit subselsects? ... in der mathematik macht man das doch auch so...

          abfrage
          PHP-Code:
          SELECT FROM watch WHERE chip_id 2204 AND (who != 'foo' AND who_website_id != 10001

          tablelle
          PHP-Code:

          CREATE TABLE 
          `watch` (
            `
          idint(11NOT NULL AUTO_INCREMENT,
            `
          whovarchar(3NOT NULL,
            `
          who_website_idint(11NOT NULL,
            `
          chip_idint(11NOT NULL,
            `
          newcommentsint(11NOT NULL DEFAULT '0',
            
          PRIMARY KEY (`id`)
          ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1434 ;

          --
          -- 
          Daten für Tabelle `ads_watch`
          --

          INSERT INTO `watch` (`id`, `who`, `who_website_id`, `chip_id`, `newcomments`) VALUES
          (1429'foo'1000122040),
          (
          1430'boo'1036122040),
          (
          1431'boo'1000222040);

          /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
          /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
          /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */
          nach meiner logik müsste jetzt alles ausgegeben werden auser die Zeile mit der ID 1429
          Zuletzt geändert von BananaJo; 08.07.2011, 21:42.

          Kommentar


          • #6
            Zitat von BananaJo Beitrag anzeigen
            Also die klammern sollen die beiden AND's zusammenfassen.
            Oder funktioniert soetwas nur mit subselsects? ... in der mathematik macht man das doch auch so...
            Wie bereits gesagt sind sie in dem Fall überflüssig. Und auch in der Mathematik sind in einem Beispiel wie 1 + (2 + 3) die Klammern überflüssig.

            Zitat von BananaJo Beitrag anzeigen
            abfrage
            PHP-Code:
            SELECT FROM watch WHERE chip_id 2204 AND (who != 'foo' AND who_website_id != 10001

            tablelle
            PHP-Code:

            CREATE TABLE 
            `watch` (
              `
            idint(11NOT NULL AUTO_INCREMENT,
              `
            whovarchar(3NOT NULL,
              `
            who_website_idint(11NOT NULL,
              `
            chip_idint(11NOT NULL,
              `
            newcommentsint(11NOT NULL DEFAULT '0',
              
            PRIMARY KEY (`id`)
            ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1434 ;

            --
            -- 
            Daten für Tabelle `ads_watch`
            --

            INSERT INTO `watch` (`id`, `who`, `who_website_id`, `chip_id`, `newcomments`) VALUES
            (1429'foo'1000122040),
            (
            1430'boo'1036122040),
            (
            1431'boo'1000222040);

            /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
            /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
            /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */
            nach meiner logik müsste jetzt alles ausgegeben werden auser die Zeile mit der ID 1429
            Wird es auch:
            Code:
            mysql> SELECT * FROM watch WHERE chip_id = 2204 AND (who != 'foo' AND who_website_id != 10001);
            +------+-----+----------------+---------+-------------+
            | id   | who | who_website_id | chip_id | newcomments |
            +------+-----+----------------+---------+-------------+
            | 1430 | boo |          10361 |    2204 |           0 |
            | 1431 | boo |          10002 |    2204 |           0 |
            +------+-----+----------------+---------+-------------+
            2 rows in set (0.00 sec)

            Kommentar


            • #7
              ach.. ich hab dir ein falsches beispiel gemacht..

              wenn aber überall "foo" steht hast du das gleiche problem wie ich habe

              PHP-Code:
              INSERT INTO `watch` (`id`, `who`, `who_website_id`, `chip_id`, `newcomments`) VALUES 
              (1429'foo'1000122040), 
              (
              1430'foo'1036122040), 
              (
              1431'foo'1000222040); 
              jetzt gehts nicht mehr.. und nichts wird ausgegeben wegen != "foo" ..

              Kommentar


              • #8
                Zitat von BananaJo Beitrag anzeigen
                jetzt gehts nicht mehr.. und nichts wird ausgegeben wegen != "foo" ..
                Du hast als eine Teilbedingung, die erfüllt sein muss (da sie mit den anderen per AND verknüpft ist) angegeben, dass du nur Datensätze haben willst, bei denen who != 'foo' ist.
                Das ist bei keinem der drei Beispieldatensätze der Fall - also gibt's logischerweise auch keinen von denen im Ergebnis.

                ist denn meine herangehenweise so richtig
                Nein, nur zu schreiben, „funzt nich wie ich will“ ist selbstverständlich nie richtig

                Stattdessen solltest du erst mal verbal beschreiben, was du eigentlich erreichen willst.
                I don't believe in rebirth. Actually, I never did in my whole lives.

                Kommentar


                • #9
                  ja deswegen waren die klammern ja da..

                  es sollen nur die datensätze ausgegeben werden die die chip_id = 2204 haben und bei denen (achtung) who UND who_website_id (beide werte zusammen betrachten!!!) nicht foo und 10001 ist

                  somit ist der erste datensatz aus der suche raus...

                  wenn bei den anderen foo's eine andere who_website_id ist als 10001, dann ist es ok und der datensatz soll ausgegeben werden.

                  Kommentar


                  • #10
                    Zitat von BananaJo Beitrag anzeigen
                    es sollen nur die datensätze ausgegeben werden die die chip_id = 2204 haben und bei denen (achtung) who UND who_website_id (beide werte zusammen betrachten!!!) nicht foo und 10001 ist
                    Das erreichst du aber nicht mit Klammern alleine.

                    Du willst wohl eher: WHERE chip_id = 2204 AND NOT ( who = 'foo' AND who_website_id = 10001 )
                    Zuletzt geändert von h3ll; 08.07.2011, 23:01.

                    Kommentar


                    • #11
                      Zitat von BananaJo Beitrag anzeigen
                      ja deswegen waren die klammern ja da..
                      Sind aber unsinnig an der Stelle:
                      Zitat von h3ll Beitrag anzeigen
                      Die Klammer kannst du dir komplett sparen, X AND ( Y AND Z ) das selbe wie X AND Y AND Z ist. Genauso wie 1 + (2 + 3) das selbe wie 1 + 2 + 3 ist.
                      es sollen nur die datensätze ausgegeben werden die die chip_id = 2204 haben und bei denen (achtung) who UND who_website_id (beide werte zusammen betrachten!!!) nicht foo und 10001 ist
                      Also willst du die Bedingung who='foo' AND who_website_id=10001 als ganzes nehmen und negieren.
                      I don't believe in rebirth. Actually, I never did in my whole lives.

                      Kommentar


                      • #12
                        Danke!!! das mit "AND NOT" funktioniert genau so wie ich das haben wollte!

                        Kommentar

                        Lädt...
                        X