Anfängerfrage - Select
Simone
- datenbank
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
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
FROMnodedb
WHEREnode\_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
FROMnodedb
WHEREnode\_bez
LIKE 'Frankreich'
or FIND_IN_SET( node_id, '299354,298458,298459,298031,1024456' )
^^^ node_punkt(1) ^^^ node_punkt(2)Also
erste Bedingungnach 'Frankreich' = 2 Einträge (=2 x node_punkt)
zweite Bedingung
nach 'node,node' = 2 node_punkt verknüpft
Danke Simone
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') -> 0Gruß
Hans
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
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
HI, Hans
ich hab's -> left Join
Dank Dir nochmal...
Simone
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
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