jenslm: nur einen wert abfragen

nehmen wir mal an ich hab folgende datensaetze:

id=1
sonstwas=051

id=2
sonstwas=051, 052

id=3
sonstwas=053

wenn ich eine abfrage ala [...]WHERE sonstwas = 051[...]
tätige wird nur der erste angezeigt.
wie kann ich realisieren dass die ersten beiden angezeigt werden nicht aber der dritte?

lg, jens

  1. wenn ich eine abfrage ala [...]WHERE sonstwas = 051[...]
    tätige wird nur der erste angezeigt.
    wie kann ich realisieren dass die ersten beiden angezeigt werden nicht aber der dritte?

    lg, jens

    Was für ein Datentyp ist sonsteas denn?

    Wenn es ein VARCHAR also String ist, dann kannst du mit LIKE was machen.

    Also WHERE sonstwas LIKE '%051%' ...

    Klaus

    1. Hello,

      wenn ich eine abfrage ala [...]WHERE sonstwas = 051[...]
      tätige wird nur der erste angezeigt.
      wie kann ich realisieren dass die ersten beiden angezeigt werden nicht aber der dritte?

      lg, jens

      Was für ein Datentyp ist sonsteas denn?

      Wenn es ein VARCHAR also String ist, dann kannst du mit LIKE was machen.

      Also WHERE sonstwas LIKE '%051%' ...

      Das LIKE ist hier nicht exakt, denn die 051 würden ja uch in 130581 vorkommen, was hier aber nicht gewünscht ist.

      Es käme ggf. auch die Funktion find_in_set() in Frage:
      http://dev.mysql.com/doc/refman/5.1/de/string-functions.html

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. also ich beshcrieb dsas jetztmal genauer:

        id=1
        text=hallo
        wo=1

        id=2
        text=tschuess
        wo=1, 2

        id=3
        text=ciao
        wo=2

        wie mach ich eine abfrage bei der datensatz 1 und 2 bzw. bei der 2 und 3 angezeigt werden nicht aber der jeweils uebrige? es geht naemlich darum dass die texte auf mehreren seiten angezeigt werden sollen.
        und das mit SET oder ENUM geht auch nicht, weil dann muesste ich die erlaubten Werte ja alle vorher eingeben...was irgendwie keinen sinn macht!

        lg, jens

        1. Hoi!

          Okay. Bisher galt hier fuer mich: 'Im Zweifel fuer den Angeklagten' und ich bin mal wohlwollend davon ausgegangen, dass du nicht 2 Werte in einem Feld speicherst, auch wenn es so ausgesehen hat.

          Die Antwort ist also: Aendere Deine Datenstruktur. Normalisiere Deine Tabellen.

          --
          "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
                - T. Pratchett
          1. wie soll ich die normalisieren?
            wenn ich mit der spalte "wo" angeben will wo der datensatz angezeigt wird??
            da muessen doch dann mehrer werte rein, wenn er auf mehrern seiten angezeigt werden soll?!
            lg, jens

            1. Mahlzeit jenslm,

              wie soll ich die normalisieren?

              Informiere Dich.

              wenn ich mit der spalte "wo" angeben will wo der datensatz angezeigt wird??

              Die Spalte "wo" sollte es nach einer sinnvollen Normalisierung gar nicht mehr geben.

              da muessen doch dann mehrer werte rein, wenn er auf mehrern seiten angezeigt werden soll?!

              Nein - eben genau deswegen solltest Du ja Dein komplettes Tabellendesign normalisieren.

              MfG,
              EKKi

              --
              sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
            2. Hello,

              wie soll ich die normalisieren?

              normalisieren bedeutet hier, aus einer mehrwertigen Spalte eine eigene Tabelle mit einwertigen Spakten zu machen.

              aus    id: 1       Wo:  1,3,77,23,505
                     id: 2       Wo:  3,9,27,603,22,666

              wird   id          Wo
                      1           1
                      1           3
                      1          77
                      1          23
                      1         505
                      2           3
                      2           9
                      2          27
                      2         603
                      2          22
                      2         666

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. alles kla datenbank ist soweit. und wie mach ich jetzt die abfrage?

                erstens:
                $sql = "SELECT wo FROM shownin WHERE id = '1'";
                $result = mysql_query($sql, $database) or die(mysql_error());
                $row = mysql_fetch_assoc($result);

                zweitens:
                $sql = "SELECT * FROM article WHERE wo = 'werte von oben'";
                $result = mysql_query($sql, $database) or die(mysql_error());
                $row = mysql_fetch_assoc($result);

                wie mach ich das mit werte von oben? mein problem is, dass ich nicht weiß wie ich die ganzen werte von der ersten abfrage in die zweite einbringe?! gibts dafür n spezielles mysql_fetch?
                lg, jens

                1. Hi,

                  erstens:
                  $sql = "SELECT wo FROM shownin WHERE id = '1'";
                  $result = mysql_query($sql, $database) or die(mysql_error());
                  $row = mysql_fetch_assoc($result);

                  zweitens:
                  $sql = "SELECT * FROM article WHERE wo = 'werte von oben'";
                  $result = mysql_query($sql, $database) or die(mysql_error());
                  $row = mysql_fetch_assoc($result);

                  wie mach ich das mit werte von oben?

                  So, wie mit der 1 in der ersten Abfrage auch - du setzt Werte in einen Textstring ein.

                  mein problem is, dass ich nicht weiß wie ich die ganzen werte von der ersten abfrage in die zweite einbringe?!

                  Was meinst du mit „die *ganzen* Werte“?
                  Es wird, wenn du so wie beschrieben vorgehst, maximal einer sein.

                  gibts dafür n spezielles mysql_fetch?

                  Wozu spezieller?
                  Die mysql_fetch-Funktionen liefern dir den Inhalt eines Datensatzes - du musst ihn jetzt nur noch verarbeiten.

                  Noch mal: Lerne bitte *Grundlagen*, bevor du hier andauernd eine Frage nach der nächsten zu solchen Trivialitäten abfeuerst.

                  MfG ChrisB

                  --
                  “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
                  1. nein eben nicht du verstehst mich bloss nicht

                    erstens:
                    $sql = "SELECT wo FROM shownin WHERE artikelid = '1'";
                    $result = mysql_query($sql, $database) or die(mysql_error());
                    $row = mysql_fetch_assoc($result);

                    zweitens:
                    $sql = "SELECT * FROM article WHERE wo = 'werte von oben'";
                    $result = mysql_query($sql, $database) or die(mysql_error());
                    $row = mysql_fetch_assoc($result);

                    wie mach ich das mit werte von oben?

                    da sind mehrere datensaetze!!! und artikelid ist ungleich primary key!!!

                    lg, jens

                    1. Hi,

                      nein eben nicht du verstehst mich bloss nicht

                      Du verstehst ziemlich wenig ...

                      $sql = "SELECT wo FROM shownin WHERE artikelid = '1'";
                      $result = mysql_query($sql, $database) or die(mysql_error());
                      $row = mysql_fetch_assoc($result);

                      da sind mehrere datensaetze!!!

                      Na dann sollte doch wohl klar sein, dass das Abholen von nur einem Datensatz nicht ausreichend ist, sondern eine Schleife über alle Datensätze erforderlich ist.

                      MfG ChrisB

                      --
                      “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
                      1. ja und um den datensatz auszugeben benutz man do...while.
                        aber wie bring ich denn werte in die zweite abfrage ein?
                        lg

                        1. Hallo,

                          aber wie bring ich denn werte in die zweite abfrage ein?

                          indem Du nur eine einzige Abfrage stellst :-)
                          Du bist gerade dabei, Joins in PHP nachzubauen.

                          Grundlagen zu Joins vermitteln wir Dir sehr gerne. Rouven und ich haben dazu Artikel verfasst:

                          Einführung in Joins
                          Fortgeschrittene Jointechniken

                          Es ist normalerweise überhaupt keine gute Idee, Abfragen in Schleifen abzufeuern.

                          Freundliche Grüße

                          Vinzenz

                2. Mahlzeit jenslm,

                  alles kla datenbank ist soweit.

                  Wie weit? Wie sieht die jeweiligen Tabellenstruktur jetzt aus?

                  und wie mach ich jetzt die abfrage?

                  Sinnvollerweise so, dass die Ergebnismenge das enthält, das Du erwartest und benötigst.

                  Genauer kann man Dir das nur beantworten, wenn Du die Struktur der beteiligten Tabellen zeigst und vielleicht einige Beispieldatensätze angibst.

                  MfG,
                  EKKi

                  --
                  sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                3. Hallo,

                  SELECT wo FROM shownin WHERE id = '1';
                  SELECT * FROM article WHERE wo = 'werte von oben';

                  kann man zusammenfassen zu:

                  SELECT  
                      a.*  
                  FROM  
                      article a  
                  INNER JOIN  
                      shownin s  
                  ON  
                      a.wo = s.wo  
                  WHERE  
                      s.id = 1  
                  
                  

                  wie mach ich das mit werte von oben? mein problem is, dass ich nicht weiß wie ich die ganzen werte von der ersten abfrage in die zweite einbringe?!

                  wie ich sage: nur eine einzige Abfrage vornehmen.

                  Freundliche Grüße

                  Vinzenz

                  1. tabelle article:
                    id = primary key
                    einleitung = einleitung
                    text = Artikeltext

                    tabelle shownin:
                    id = primary key
                    articleid = article
                    where = seite auf der der artikel angezeigt werden soll

                    code:

                    SELECT a.* FROM article a

                    a ist die Spalt ist das richtig? also muesst ich jetzt hier eigentlich

                    SELECT * FROM article

                    nehmen

                    SELECT
                        a.*
                    FROM
                        article a
                    INNER JOIN
                        shownin s
                    ON
                        a.wo = s.wo
                    WHERE
                        s.id = 1

                    was ich am geruest nicht verstehe ist a und s. was soll das sein? eine spalte oder? lg

                    1. also ich hab mich nochmal damit beschaeftigt und in soweit gekommen:

                      tabelle article:

                      id  |  article
                      -------------------
                      1   |  beispieltext
                      -------------------
                      2   |  infotext
                      -------------------

                      tabelle article_whereto:

                      id  |  mid  |  type
                      -------------------
                      1   |  1    |  test
                      -------------------
                      2   |  2    |  test

                      SELECT * FROM article INNER JOIN article_whereto ON article.id = article_whereto.mid WHERE article_whereto.type = 'test'

                      funktioniert aber nicht was hab ich falsch gemacht?
                      lg

                      1. Mahlzeit jenslm,

                        SELECT * FROM article INNER JOIN article_whereto ON article.id = article_whereto.mid WHERE article_whereto.type = 'test'

                        funktioniert aber nicht

                        "Funktioniert nicht" funktioniert nicht. *Was genau* passiert? Bekommst Du eine Fehlermeldung? Wenn ja: wie lautet sie? Bekommst Du einfach nur keine Daten? *Wie genau* stellst Du diese Abfrage? Per PHP? Per phpMyAdmin? Direkt auf der Datenbank? Liegt der Fehler also vielleicht gar nicht an MySQL, sondern an irgendetwas auf dem Weg dahin?

                        was hab ich falsch gemacht?

                        Das kann man Dir sagen, sobald Du grundlegende Informationen zu Deinem Problem lieferst.

                        MfG,
                        EKKi

                        --
                        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                      2. Hallo,

                        also ich hab mich nochmal damit beschaeftigt und in soweit gekommen:

                        tabelle article:

                        id  |  article

                        1   |  beispieltext

                        2   |  infotext

                        tabelle article_whereto:

                        id  |  mid  |  type

                        1   |  1    |  test

                        2   |  2    |  test

                        SELECT * FROM article INNER JOIN article_whereto ON article.id = article_whereto.mid WHERE article_whereto.type = 'test'

                        funktioniert aber nicht was hab ich falsch gemacht?

                        das funktioniert ganz hervorragend (soweit man beim Vorhandensein von SELECT * von hervorragend reden kann) und liefert erwartungsgemäß

                        id | article
                        ----------------
                         1 | beispieltext
                         2 | infotext

                        zurück. Wo ist das Problem?

                        Gib bitte an,

                        a) was Du als Ergebnis erwartest
                           b) was Du als Ergebnis erhältst

                        Anmerkung: Es ist eine gute Idee, SQL als SQL zu formatieren und nicht als PHP.

                        a und s waren übrigens Aliasnamen, siehe Handbuch.

                        Freundliche Grüße

                        Vinzenz

                        1.   
                          $sql = "SELECT * FROM menu INNER JOIN menu_whereto ON menu.id = menu_whereto.mid WHERE menu_whereto.type = 'info'";  
                          $result = mysql_query($sql, $database) or die(mysql_error());  
                          $row = mysql_fetch_assoc($result);  
                            
                          do  
                          {  
                          	echo $row['article'];  
                          }  
                          while ($row = mysql_fetch_assoc($result));  
                          
                          

                          liefert nichts
                          sollte liefern:
                          beispieltext
                          infotext

                          1. tut mir leid funktioniert jetzt
                            hab wieder schneller gepostet als gedacht
                            lg, jens

                            1. und wieder ein problem

                                
                              SELECT feld, feld2 FROM article WHERE lang = '$lang' INNER JOIN article_whereto ON article.id = article_whereto.mid WHERE article_whereto.type = 'test'  
                              
                              

                              funktionier nicht!
                              ich moechte nur die artikel von tabelle:article auswaehlen die bei lang entsprechende die eingestellte sprache haben und dann das alte eben....
                              wie mus sich das machen?
                              lg

                              1. Hallo,

                                SELECT feld, feld2 FROM article WHERE lang = '$lang' INNER JOIN article_whereto ON article.id = article_whereto.mid WHERE article_whereto.type = 'test'

                                  
                                
                                > funktionier nicht!  
                                  
                                das ist wenig verwunderlich. Die Reihenfolge der Klauseln (Abschnitte) einer SQL-Anweisung ist hübsch fest. Hast Du zwei Bedingungen für die Einschränkung der Ergebnismenge, die durch ein logisches UND verknüpft sind, so musst Du den AND-Operator in der WHERE-Klausel verwenden:  
                                  
                                ~~~sql
                                SELECT  
                                    feld1,  
                                    feld2  
                                FROM  
                                    article  
                                INNER JOIN  
                                    article_whereto  
                                ON  
                                    article.id = article_whereto.mid  
                                WHERE  
                                    article_where_to.type = 'test'  
                                AND  
                                    lang = <wert>  
                                
                                

                                Freundliche Grüße

                                Vinzenz

        2. FIND_IN_SET(str,strlist)

          ==

          FIND_IN_SET(info,strlist)

          und wie bringe ich die strlist da rein?
          lg, jens

          1. Hi,

            FIND_IN_SET(str,strlist)

            ==

            FIND_IN_SET(info,strlist)

            und wie bringe ich die strlist da rein?

            Was ist denn deine strlist?

            MfG ChrisB

            --
            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
            1. also die datensatze sollen auf mindestens einer und maximal 3 seiten angezeigt werden. also hat mein feld wo den wert 1 oder 1, 2 oder 1, 2, 3 oder 1, 3 usw.

              1. Hi,

                also die datensatze sollen [...]

                Das haben wir längst verstanden.
                Aber was du an der Beschreibung der Funktion im Manual nicht verstanden hast, das erklärst du uns immer noch nicht.

                Gewöhne dir bitte an, auf Rückfragen einzugehen, statt diesen auszuweichen, in dem du einfach bisher schon gesagtes noch mal wiederholst.

                MfG ChrisB

                --
                “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    2. sonstwas = varchar

      like kommt eig schon fast genau auf das raus was ich suchen nur wie tom erwehnt hat waere das mit 049051 sehr schlecht.
      wie verwende ich FIND_IN_SET hab zwar die Anleitung gelsen verstehe aber ehrlich gesagt nicht wie ich das jetzt bei mir einbauen kann?!
      lg, jens

      1. Hi,

        like kommt eig schon fast genau auf das raus was ich suchen nur wie tom erwehnt hat waere das mit 049051 sehr schlecht.

        Das Datendesign ist sehr schlecht.

        wie verwende ich FIND_IN_SET hab zwar die Anleitung gelsen verstehe aber ehrlich gesagt nicht wie ich das jetzt bei mir einbauen kann?!

        In Handbuch findet sich doch eine Beschreibung, was die Funktion macht, und ein Beispiel.
        Womit hast du jetzt noch Probleme?

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
  2. Hello,

    id=2
    sonstwas=051, 052

    Diese Datenstruktur könnte ggf. normalisiert werden. Ob das für die Praxis günstiger ist, als Deine Variante mit dem Set im String, ist Philosophie. Außerddem könnten die String-Spaltentypen SET oder ENUM hier ggf. noch weiterhelfen, in diesem Spezialfall dann vermutlich SET.

    http://dev.mysql.com/doc/refman/5.1/de/string-types.html

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de