Ähnlichkeiten finden

Ähnlichkeiten finden

am 31.10.2006 15:51:17 von Oliver Benning

Hallo,

ich habe eine kleine Lotto-Simulation. In Tabelle A werden die
Lotto-Scheine erfasst und in Tabelle B die getippten Zahlen pro Schein.

Wenn ich einen neuen Schein speichere, möchte ich ermitteln, ob eine
Teil-Kombination schon in einem anderen Schein getippt wurde.

Ich tippe z.B. 3, 6, 12, 27, 36, 41, jemand anders hat vor mir z.B.
1,6,17,27,39,41 getippt.

Jetzt möchte ich mit MySQL bestimmen, welche Scheine aus TabelleA
Ähnlichkeiten mit dem neuen Schein haben und zwar mit der Anzahl der
Übereinstimmungen.

In dem obigen Beispiel wären es 3 Übereinstimmungen (Zahl 6, 27 und 41).

Geht das? Wenn nicht, wie ermittle ich das ohne großen
Performance-Verlust auf Anwendungsebene?

Gruß,
Oliver

Re: Ähnlichkeitenfinden

am 31.10.2006 16:37:13 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Ähnlichkeitenfinden

am 31.10.2006 16:56:29 von Wolfgang Schwach

Andreas Kretschmer wrote:
> begin Oliver Benning wrote:
>> Hallo,
>
>> ich habe eine kleine Lotto-Simulation. In Tabelle A werden die
>> Lotto-Scheine erfasst und in Tabelle B die getippten Zahlen pro Schein.
>
>> Wenn ich einen neuen Schein speichere, möchte ich ermitteln, ob eine
>> Teil-Kombination schon in einem anderen Schein getippt wurde.
>
>> Ich tippe z.B. 3, 6, 12, 27, 36, 41, jemand anders hat vor mir z.B.
>> 1,6,17,27,39,41 getippt.
>
>> Jetzt möchte ich mit MySQL bestimmen, welche Scheine aus TabelleA
>> Ähnlichkeiten mit dem neuen Schein haben und zwar mit der Anzahl der
>> Übereinstimmungen.
>
>> In dem obigen Beispiel wären es 3 Übereinstimmungen (Zahl 6, 27 und 41).
>
> Mmh. Du könntest Dir eine temp. table aus UNIONs basteln, etwa so:
>
> Ich unterstelle, du hast eine tab_b mit (schein, zahl), die Deine Tipps
> enthält:
>
> select schein, 3 from tab_b where zahl=3 union select schein, 6 from
> tab_b where zahl = 6 union ...

Mit dieser Tabelle geht es sogar noch einfacher:
SELECT schein, count(zahl) as Anzahl_uebereinstimmungen
FROM tab_b WHERE zahl in ( 3, 6, 12, 27, 36, 41) GROUP BY schein;

Gruss Wolfgang
--
__________A_K_K___________
_____wolfgang_schwach_____
____w@akk.org/w@w35.de____

Re: Ähnlichkeitenfinden

am 31.10.2006 17:32:49 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Ähnlichkeiten finden

am 03.11.2006 14:33:36 von Oliver Benning

Wolfgang Schwach wrote:
> Andreas Kretschmer wrote:
>> begin Oliver Benning wrote:
>>> ich habe eine kleine Lotto-Simulation. In Tabelle A werden die
>>> Lotto-Scheine erfasst und in Tabelle B die getippten Zahlen pro
>>> Schein.
>>
>>> Wenn ich einen neuen Schein speichere, möchte ich ermitteln, ob eine
>>> Teil-Kombination schon in einem anderen Schein getippt wurde.
>>
>>> Ich tippe z.B. 3, 6, 12, 27, 36, 41, jemand anders hat vor mir z.B.
>>> 1,6,17,27,39,41 getippt.
>>
>>> Jetzt möchte ich mit MySQL bestimmen, welche Scheine aus TabelleA
>>> Ähnlichkeiten mit dem neuen Schein haben und zwar mit der Anzahl der
>>> Übereinstimmungen.
>>
>>> In dem obigen Beispiel wären es 3 Übereinstimmungen (Zahl 6, 27 und
>>> 41).
>>
>> Mmh. Du könntest Dir eine temp. table aus UNIONs basteln, etwa so:
>>
>> Ich unterstelle, du hast eine tab_b mit (schein, zahl), die Deine
>> Tipps enthält:
>>
>> select schein, 3 from tab_b where zahl=3 union select schein, 6 from
>> tab_b where zahl = 6 union ...
>
> Mit dieser Tabelle geht es sogar noch einfacher:
> SELECT schein, count(zahl) as Anzahl_uebereinstimmungen
> FROM tab_b WHERE zahl in ( 3, 6, 12, 27, 36, 41) GROUP BY schein;

Funktioniert, sagt aber nichts darüber aus, welche Zahlengruppen
identisch sind? Wenn mehrere Scheine z.B. 3 Übereinstimmungen
zurückliefern, heisst das nicht, daß das auch immer die gleichen drei
Zahlen sind.

Geht das auch irgendwie, daß ich zurückgeliefert bekomme, welche der
Zahlen identisch sind?

Re: Ähnlichkeitenfinden

am 03.11.2006 17:14:12 von Wolfgang Schwach

Oliver Benning wrote:
> Wolfgang Schwach wrote:
>> Andreas Kretschmer wrote:
>>> begin Oliver Benning wrote:
>>>> ich habe eine kleine Lotto-Simulation. In Tabelle A werden die
>>>> Lotto-Scheine erfasst und in Tabelle B die getippten Zahlen pro
>>>> Schein.
>>>
>>>> Wenn ich einen neuen Schein speichere, möchte ich ermitteln, ob eine
>>>> Teil-Kombination schon in einem anderen Schein getippt wurde.
>>>
>>>> Ich tippe z.B. 3, 6, 12, 27, 36, 41, jemand anders hat vor mir z.B.
>>>> 1,6,17,27,39,41 getippt.
>>>
>>>> Jetzt möchte ich mit MySQL bestimmen, welche Scheine aus TabelleA
>>>> Ähnlichkeiten mit dem neuen Schein haben und zwar mit der Anzahl der
>>>> Übereinstimmungen.
>>>
>>>> In dem obigen Beispiel wären es 3 Übereinstimmungen (Zahl 6, 27 und
>>>> 41).
>>>
>>> Mmh. Du könntest Dir eine temp. table aus UNIONs basteln, etwa so:
>>>
>>> Ich unterstelle, du hast eine tab_b mit (schein, zahl), die Deine
>>> Tipps enthält:
>>>
>>> select schein, 3 from tab_b where zahl=3 union select schein, 6 from
>>> tab_b where zahl = 6 union ...
>>
>> Mit dieser Tabelle geht es sogar noch einfacher:
>> SELECT schein, count(zahl) as Anzahl_uebereinstimmungen
>> FROM tab_b WHERE zahl in ( 3, 6, 12, 27, 36, 41) GROUP BY schein;
>
> Funktioniert, sagt aber nichts darüber aus, welche Zahlengruppen
> identisch sind? Wenn mehrere Scheine z.B. 3 Übereinstimmungen
> zurückliefern, heisst das nicht, daß das auch immer die gleichen drei
> Zahlen sind.
>
> Geht das auch irgendwie, daß ich zurückgeliefert bekomme, welche der
> Zahlen identisch sind?

In einer einzigen Abfrage geht das, glaub ich zumindest, nicht.
Mit eiener Temporärtabelle schon:

CREATE TABLE tmp_lottozähler AS SELECT schein, count(zahl) as Anzahl_uebereinstimmungen
FROM tab_b WHERE zahl in ( 3, 6, 12, 27, 36, 41) GROUP BY schein;
SELECT a.schein, a.Anzahl_uebereinstimmungen, b.zahl
FROM tmp_lottozähler a, tab_b b
WHERE a.schein=b.schein AND b.zahl in ( 3, 6, 12, 27, 36, 41)
ORDER BY a.Anzahl_uebereinstimmungen, b.zahl;

und dann nicht vergessen die Temporärtabelle wegzuschmeissen:
DROP TABLE tmp_lottozähler;

Ist zwar etwas vermurkst, erfüllt aber seinen Zweck.

Gruss Wolfgang

--
__________A_K_K___________
_____wolfgang_schwach_____
____w@akk.org/w@w35.de____

Re: Ähnlichkeitenfinden

am 04.11.2006 00:22:51 von Christian Hammers

On 2006-11-03 Wolfgang Schwach wrote:
> und dann nicht vergessen die Temporärtabelle wegzuschmeissen:
> DROP TABLE tmp_lottozähler;

BTW, das kann man sich sparen, wenn man "CREATE TEMPORARY TABLE" benutzt, d=
ie
besteht nur für die Dauer der Session und kann sogar in parallelen Sessio=
ns
den gleichen Namen haben.

bye,

-christian-