User since
2006-07-12
31
Artikel
BenutzerIn
Hallo,
ich habe Datensätze in Tabellen
Hier z.B. zwei
x: a b c d
y: b d e f g
nun will ich die elemente von x mit denen aller anderen datensätze vergleichen. wenn zwei elemente in einem anderen datensatz gefunden werden ist dies ein treffer und soll gespeichert werden.
hat evtl. jemand eine idee wie man das möglichst effizient lösen kann? die elemente sind worte.
ich würde jetzt wohl für jedes mögliche element-paar sql abfragen duchführen vermute aber dass es für solche fragestellungen besser geeignetere algorithmen gibt.
idt, text
1, x
2, y
idw, wort, idt
1, a, 1
2, b, 1
3, c, 1
4, d, 1
5, b, 2
6, d, 2
7, e, 2
8, f, 2
9, g, 2
User since
2003-08-04
14371
Artikel
ModeratorIn
Kannst Du vielleicht auch kurz skizzieren, was bei Deinem Beispiel als Ergebnis rauskommen soll?
User since
2003-08-07
2921
Artikel
BenutzerIn
Es gibt da diese IN(@LISTE) - Syntax (oder ähnlich), eventuell kannst du damit was anfangen. Du könntest für jedes Element-Paar aus Tabelle1 nachsehen, ob es in der Liste aus allen Werten in Tabelle2 vorkommt. Allerdings dürfte das absolut unperformant sein. Bestimmt hat noch jemand bessere Ideen :)
User since
2006-07-12
31
Artikel
BenutzerIn
mein Beispiel ist wirklich etwas schwer verständlich
ich suche mit allen elementen von x ob genau zwei in den elementen von y (und na klar wären da noch viele weitere zu prüfen). wenn es da einen treffer gibt sehe ich dass x und y in einer beziehung zueinander stehen
ich muss also paare bilden und abfragen
hat y elemente
a+b oder a+c oder a+d oder b+c oder b+d oder c+d
die elemente sind worte
die anzahl variiert\n\n
<!--EDIT|Franz|1173818652-->
User since
2003-08-07
2921
Artikel
BenutzerIn
Ja da gebe ich dir voll undganz recht. Das ist unverständlich :p
Du hast die Menge A: qw(wort1 wort2 wort3)
Und die Menge B: qw(poi uzt ztr)
Und du möchtest jetzt
a) wissen ob zwei Elemente von A in der Menge B vorkommen, also ob z.B. wort1 und wort2, oder wort1 und wort3 oder wort2 und wort3 in B vorkommen, oder
b) wort1 zweimal in B vorkommt.
Ich tippe momentan auf a), und dafür kannst du die IN() - Syntax in SQL verwenden. Du guckst, ob eines der Elemente wie unter a) aufgeführt IN( der Liste aller Wörter aus der Menge B ) sind.
User since
2003-08-04
14371
Artikel
ModeratorIn
@Franz: Du hast doch oben die zwei Listen gepostet. Was soll denn bei diesen Listen als Ergebnis rauskommen?
User since
2006-07-12
31
Artikel
BenutzerIn
[quote=pktm,14.03.2007, 01:00]Ja da gebe ich dir voll undganz recht. Das ist unverständlich :p
Du hast die Menge A: qw(wort1 wort2 wort3)
Und die Menge B: qw(poi uzt ztr)
Und du möchtest jetzt
a) wissen ob zwei Elemente von A in der Menge B vorkommen, also ob z.B. wort1 und wort2, oder wort1 und wort3 oder wort2 und wort3 in B vorkommen
Ich tippe momentan auf a), und dafür kannst du die IN() - Syntax in SQL verwenden. Du guckst, ob eines der Elemente wie unter a) aufgeführt IN( der Liste aller Wörter aus der Menge B ) sind.[/quote]
ja, a) ist korrekt
wenn zwei elemente der Menge A in der Menge B vorhanden sind will ich das erkennen.
Nur habe ich nicht nur eine Menge B, die zu untersuchen ist, sondern eher viele viele mehr.... sagen wir einmal 1 Million Mengen in der Art
M(wort1 wort2 wort3)
M1 { M1.1(poi uzt ztr),M1.2(fjr xkf djx),M1.3(fsd hgf asd)...}
M2 { M2.1(pui sjt ijr),M2.2(flr lkr drq),M2.3(rds abc kle)...}
....
wie ich das in eine DB-Form bringe weiss ich noch nicht und wie ich dann die Abfrage gestalte erst recht nicht :-/ das ganze muss ja halbwegs performant sein für eine große Menge an Datensätzen... ich weiss auch noch nicht wie groß die Datenmenge wird .... evtl. kann ich das ja einfach alles in hashes packen?
User since
2003-08-07
2921
Artikel
BenutzerIn
Ja dann würde ich jetzt vorschlagen, dass du uns mal eine Probe deiner Datensätze gibst, dann müssen wir nicht rumraten.
Was bekommst du für Daten? In welchem Format? Was willst du aus diesen Daten machen?
User since
2005-09-08
300
Artikel
BenutzerIn
Hallöle?
Wenn sich die Daten sowieso in einer DB befinden, kann die Suche auf 2 übereinstimmende Elemente nicht mit DB-Bordmitteln durchgeführt werden? Ich kenne mich mit SQL nicht so gut aus, aber ich könnte mir vorstellen, daß man das irgendwie hinbekommt und es wäre dann auch performanter. Wahrscheinlich kommt es nur darauf an, das Schema der DB geeignet zu modellieren. ... ist nur so eine Idee ;o)
Gruss, Doc
User since
2005-12-17
1615
Artikel
HausmeisterIn
Hallo doc,
[quote=docsnyder,15.03.2007, 10:10]Hallöle?
Wenn sich die Daten sowieso in einer DB befinden, kann die Suche auf 2 übereinstimmende Elemente nicht mit DB-Bordmitteln durchgeführt werden?[/quote]
ja, das geht... ich hab hier mal einen kleinen Hack:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
use test_db_foo_bar;
create table filter (c1 varchar(255));
create table data (c0 int, c1 varchar(255));
insert into filter (c1) values ('a b c d');
insert into data (c0,c1) values (1, 'x x x x');
insert into data (c0,c1) values (2, 'a x x x');
insert into data (c0,c1) values (3, 'a b x x');
insert into data (c0,c1) values (4, 'a b c x');
insert into data (c0,c1) values (5, 'a b c d');
delimiter //
create procedure demo()
begin
declare filter_c1,data_c1,str,tmp varchar(255);
declare len,pos,data_c0,cnt int default 0;
declare done BOOL default FALSE;
declare cur1 cursor for select c1 from filter;
declare cur2 cursor for select c0,c1 from data;
declare continue handler for not found set done := TRUE;
open cur1;
label1: loop
fetch cur1 into filter_c1;
if done then
leave label1;
end if;
open cur2;
label2: loop
fetch cur2 into data_c0, data_c1;
if done then
leave label2;
end if;
set tmp = filter_c1;
set cnt = 0;
label3: loop
set pos = instr(tmp, ' ');
set len = length(tmp);
if pos = 0 then
set str = concat('%',tmp,'%');
else
set str = concat('%',substr(tmp, 1, pos-1),'%');
end if;
set tmp = substr(tmp, pos+1, len);
if data_c1 like str then
set cnt = cnt+1;
end if;
if cnt = 2 then
select data_c0, data_c1;
leave label3;
end if;
if pos = 0 then
leave label3;
end if;
end loop label3;
end loop label2;
close cur2;
end loop label1;
close cur1;
end
//
delimiter;
call demo();
Dieser gibt genau die Zeilen aus, die mindestens zwei Treffer haben:
data_c0 data_c1
3 a b x x
data_c0 data_c1
4 a b c x
data_c0 data_c1
5 a b c d
Ich bin kein Profi, was Prozeduren angeht, aber es funktioniert.
Gruss,
opi\n\n
<!--EDIT|opi|1173966461-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.