Simone: Anfängerfrage - Select

HI,

Ich bitte um Hilfe  [ ich == Anfängerproblem ;o) ]

DB Struktur

ID  | node_id | node_bez   | node                |node_lang
------------------------------------------------------------
216 | 298470  | Frankreich |299354,298458,298459 |DE
286 | 298039  | Frankreich |298031,1024456       |DE
....
....

SELECT ID , node\_id , node\_bez , node\_punkt , node\_lang
FROM nodedb
WHERE  node\_bez LIKE 'Frankreich'

Listet alle Einträge mit Frankreich

Jetzt möchte ich aber noch alle Einträge die unter Spalte node_punkt zusätzlich abfragen ohne nochmals ein Select ausführen zumüssen

Beispiel;

SELECT ID , node\_id , node\_bez , node\_punkt
as node, node\_lang
FROM nodedb
WHERE node\_bez
LIKE 'Frankreich'
or FIND_IN_SET( node_id, '299354,298458,298459,298031,1024456' )
                            ^^^ node_punkt(1)  ^^^ node_punkt(2)

Also
erste Bedingung

nach 'Frankreich' = 2 Einträge (=2 x node_punkt)

zweite Bedingung

nach  'node,node' = 2 node_punkt verknüpft

Danke Simone

  1. Hallo Simone,

    ich habe meine Haus-Zigeunerin gefragt, die hat kurz im Kaffeesatz gelesen und mir folgende Antwort gegeben:
    Wenn ich Dich richtig verstanden habe, dann willst Du all die Eintraege bekommen, die in der node-Spalte (String) mindestens ein vorkommen der node_id (number) eines gefundenen Ergebnisses haben, richtig ?

    Nun, von oracle her würde ich folgendes versuchen:

    select id, node_id, node_bez, node_punkt as node, node_lang
    from nodedb
    where node_bez='Frankreich'
    or instr(node,to_char(node_id)) != 0;

    instr-Funktion:

    instr('Hallo','al') -> 2
    instr('Hans','ui') -> 0

    Gruß

    Hans

    HI,

    Ich bitte um Hilfe  [ ich == Anfängerproblem ;o) ]

    DB Struktur

    ID  | node_id | node_bez   | node                |node_lang

    216 | 298470  | Frankreich |299354,298458,298459 |DE
    286 | 298039  | Frankreich |298031,1024456       |DE
    ....
    ....

    SELECT ID , node\_id , node\_bez , node\_punkt , node\_lang
    FROM nodedb
    WHERE  node\_bez LIKE 'Frankreich'

    Listet alle Einträge mit Frankreich

    Jetzt möchte ich aber noch alle Einträge die unter Spalte node_punkt zusätzlich abfragen ohne nochmals ein Select ausführen zumüssen

    Beispiel;

    SELECT ID , node\_id , node\_bez , node\_punkt
    as node, node\_lang
    FROM nodedb
    WHERE node\_bez
    LIKE 'Frankreich'
    or FIND_IN_SET( node_id, '299354,298458,298459,298031,1024456' )
                                ^^^ node_punkt(1)  ^^^ node_punkt(2)

    Also
    erste Bedingung

    nach 'Frankreich' = 2 Einträge (=2 x node_punkt)

    zweite Bedingung

    nach  'node,node' = 2 node_punkt verknüpft

    Danke Simone

    1. HI, Hans

      Danke erstmal, bin echt überfragt, auch Google und Glaskugel helfen mir nicht weiter ;o)

      In der Spalte node_punkt sind die übergeordneten Node Punkte abgelegt
      Der Bezug ist zur Spalte node_id. Also was in 'node_punkt' vorkommt hat auch eine node_id (+Bezeichnung) und die will ich haben.

      Ich möchte abfragen wo 'Frankreich' vorkommt und gleichzeitig die Nodepunkte(+Bez.) darüber selektieren.

      -------------
      Fehler

      SQL-Befehl :

      SELECT id, node_id, node_bez, node_punkt
      as node, node_lang
      FROM nodedb
      where node_bez = 'Frankreich'
      or instr( node, to_char(

      node_id
      ) ) != 0
      LIMIT 0, 30

      MySQL meldet:

      You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near '(node_id)) != 0 LIMIT 0, 30' at line 1

      Hallo Simone,

      ich habe meine Haus-Zigeunerin gefragt, die hat kurz im Kaffeesatz gelesen und mir folgende Antwort gegeben:
      Wenn ich Dich richtig verstanden habe, dann willst Du all die Eintraege bekommen, die in der node-Spalte (String) mindestens ein vorkommen der node_id (number) eines gefundenen Ergebnisses haben, richtig ?

      Nun, von oracle her würde ich folgendes versuchen:

      select id, node_id, node_bez, node_punkt as node, node_lang
      from nodedb
      where node_bez='Frankreich'
      or instr(node,to_char(node_id)) != 0;

      instr-Funktion:

      instr('Hallo','al') -> 2
      instr('Hans','ui') -> 0

      Gruß

      Hans

      1. Hi Simone,

        select id, node_id, node_bez, node_punkt as node, node_lang
        from nodedb
        where node_bez='Frankreich'
        or instr(node,to_char(node_id)) != 0;

        instr-Funktion:

        instr('Hallo','al') -> 2
        instr('Hans','ui') -> 0

        also, daß das Statement nicht unter MySQL läuft war mir klar, denn mysql kennt bestimmt nicht instr-Funktion. Daher habe ich Dir zwei Beispiele gemacht, wie es geht.

        Guck bitte im Manual nach, wie die Funktion heißt, die nach einem Teilstring in einem String sucht und dann programmiere entsprechend des Returncodes.

        Retuncode          Aktion
        null               and (meine_funktion(node_id, node) is not null
        teilstring         and length(meine_funktion(node_id, node)) is not null

        Bitte nicht 1:1 übernehmen, da mysql bestimmt wieder ganz andere syntax hat, aber ich hoffe, die Vorgehensweise ist jetzt klar geworden, oder ?

        Gruß

        Hans

        1. HI, Hans

          Danke Dir!

          Mein Problem bei der Sache ist:
          DB Struktur

          ID  | node_id | node_bez   | node                |node_lang
          ------------------------------------------------------------
          216 | 298470  | Frankreich |299354,298458,298459 |DE
          286 | 298039  | Frankreich |298031,1024456       |DE
          ....
          ....

          Mit der Abfrage erhalte ich ein Teilergebnis:

          SELECT ID , node\_id , node\_bez , node\_punkt
          as node, node\_lang
          FROM nodedb
          WHERE node\_bez
          LIKE 'Frankreich'

          Also alles wo 'Frankreich' drin vorkommt.

          Ich brauche jedoch auch den Spalten Inhalt von node_punkt zur Laufzeit um dort eine weitere Bedingung zu formulieren.

          Beispiel:
          SELECT ID , node\_id , node\_bez , node\_punkt , node\_lang
          FROM amazonnode
          WHERE node\_bez
          LIKE 'Frankreich'

          or FIND_IN_SET( node_id, ????????????node_punkt???????????)

          Das geht naturlich nicht!

          or FIND_IN_SET( node_id, '299354,298458,298459,298031,1024456' )

          Das geht und liefert das gesuchte Ergebnis

          Wer kann helfen

          Simone

          1. HI, Hans

            ich hab's  -> left Join

            Dank Dir nochmal...

            Simone

            1. yo,

              zum einen, wenn du einen verlgiech machen wilst, dann benutze auch einen entsprechenden operator dafür und nicht LIKE, sprich node_bez
              = 'Frankreich'

              zum anderen solltest du deine tabelle nodedb mal atomarisieren, das würde sehr helfen. deine tabelle verletzt nämlich die erste normalform.

              Ilja

              1. HI, Ilja

                Ich versteh nur Bahnhof! Bin halt' ein Anfänger..
                Was verstehst Du unter atomarisieren bzw. normalform ????

                Mit Like ist mir schon klar, das Beispiel sollte die Problemstellung wiederspiegeln.

                Ich habe das jetzt so gemacht;

                ID         |smallint(20)   auto_increment
                node_id    |varchar(10)
                node_bez   |varchar(100)
                node_punkt |varchar(255)
                node_lang  |char(2)

                Name Typ Kardinalität     Feld

                PRIMARY  PRIMARY  2158    ID

                nodepunkt  INDEX  2158    node_punkt
                                          node_id

                SELECT A.node_lang, A.node_id, A.node_bez, A.node_punkt, B.node_id
                as B_node_id, B.node_bez
                as B_node_bez, B.node_punkt
                as B_node_punkt
                FROM nodedb AS A
                left  Join amazonnode AS B ON FIND_IN_SET( B.node_id, A.node_punkt )
                WHERE A.node_lang='".$sprach."' AND  A.node_bez
                LIKE '%".$NAME_LAND_DE."%'
                GROUP BY  B_node_id
                Order BY B_node_punkt

                Simone