DB(mysql) nach gebildetem Wert durchsuchen

DB(mysql) nach gebildetem Wert durchsuchen

am 13.10.2004 08:27:24 von Christian Hoffart

Moin ng,

ich habe eine Suche realisiert die ein Array nach einer Nummer
durchsuchen kann. Diese Nummer setzt sich aus zwei DB werten zusammen.
Zum einen aus einer eindeutigen ID und zum anderen aus einem
Datum(Jahr), bspw. 2004000001,2004000002 usw..
Da es diese Nummer so nicht in der DB gibt und erst gebildet werden muß,
werden erst alle DB einträge + die gebildete Nummer in ein Array
geschrieben welches ich dann durchsuchen kann. Bei einer höheren Anzahl
an Datensätzen geht das natürlich auf Kosten der Geschwindigkeit.
Nun meine Frage: Gibt es eine Möglichkeit nach dieser Nummer direkt in
der DB zu suchen, bzw. die Nummer direkt in einer Abfrage zu erstellen?

Bisherige Funktion zum erstellen der Nummer

function makeNumber($id,$date)
{
$Year =date("Y",strtotime($date));

while (strlen($id)<6){
$id="0".$id;
}
$nr=$Year.$id;

return $nr;
}


Gruß Christian

Re: DB(mysql) nach gebildetem Wert durchsuchen

am 13.10.2004 08:36:59 von Rainer Huebenthal

Moin Christian Hoffart, du schriebst:

> ich habe eine Suche realisiert die ein Array nach einer Nummer
> durchsuchen kann. Diese Nummer setzt sich aus zwei DB werten zusammen.
> Zum einen aus einer eindeutigen ID und zum anderen aus einem
> Datum(Jahr), bspw. 2004000001,2004000002 usw..
> Da es diese Nummer so nicht in der DB gibt und erst gebildet werden muß,
> werden erst alle DB einträge + die gebildete Nummer in ein Array
> geschrieben welches ich dann durchsuchen kann. Bei einer höheren Anzahl
> an Datensätzen geht das natürlich auf Kosten der Geschwindigkeit.
> Nun meine Frage: Gibt es eine Möglichkeit nach dieser Nummer direkt in
> der DB zu suchen, bzw. die Nummer direkt in einer Abfrage zu erstellen?

select max(nummer) from table

Von dem so ermittelten Wert kannst du weiter aufbauen.

cu
Rainer

--
http://www.reisetraeume.com

Re: DB(mysql) nach gebildetem Wert durchsuchen

am 13.10.2004 08:42:59 von Christian Hoffart

Rainer Huebenthal wrote:

> select max(nummer) from table
>
> Von dem so ermittelten Wert kannst du weiter aufbauen.
>
> cu
> Rainer
>
??
Irgendwie versteh ich deine Antwort nicht, die Spalte nummer ist nich
existent, die nummer wird erst gebildet aus "Date" + "ID".

Ich hatte da ehr an so etwas gedacht:

select * from table where "Date(Jahr)+ID(0.ID bis 6 Zeichen lang)" like
%meineSuche%

Gruß Christian

Re: DB(mysql) nach gebildetem Wert durchsuchen

am 13.10.2004 09:41:20 von Rainer Huebenthal

Moin Christian Hoffart, du schriebst:

>> select max(nummer) from table
>>
>> Von dem so ermittelten Wert kannst du weiter aufbauen.

> Irgendwie versteh ich deine Antwort nicht, die Spalte nummer ist nich
> existent,

Da du nicht gesagt hast, wie deine Spalte heisst, musste ich
mir eben eine ausdenken.

> die nummer wird erst gebildet aus "Date" + "ID".

Und landet in der Datenbank? Dann wird sie dort einen Namen
haben.

> Ich hatte da ehr an so etwas gedacht:
>
> select * from table where "Date(Jahr)+ID(0.ID bis 6 Zeichen lang)" like
> %meineSuche%

Like %irgendwas% erzeugt einen Table-Space-Scan und das willst
du nicht.

Was genau ist dein Problem? Du willst einen Datensatz
einfügen, dieser hat den PK JJJJnnnnnn und du moechtest nnnnnn
bestimmen, so das du keine Kollisionen hast? Dann war meine
Loesung korrekt. Obwohl ich dein Design fuer daneben halte.
Ich würde eine Spalte char4 mit dem Jahr ablegen und die
nummer als int. Das ganze dann als konkatenierten Schluessel.

cu
Rainer

--
http://www.reisetraeume.com

Re: DB(mysql) nach gebildetem Wert durchsuchen

am 13.10.2004 11:55:37 von Christian Hoffart

Rainer Huebenthal wrote:
> Da du nicht gesagt hast, wie deine Spalte heisst, musste ich
> mir eben eine ausdenken.
>
>
>>die nummer wird erst gebildet aus "Date" + "ID".
>
>
> Und landet in der Datenbank? Dann wird sie dort einen Namen
> haben.

Nein, die Nummer landet nicht in der DB
>
>
>>Ich hatte da ehr an so etwas gedacht:
>>
>>select * from table where "Date(Jahr)+ID(0.ID bis 6 Zeichen lang)" like
>>%meineSuche%
>
>
> Like %irgendwas% erzeugt einen Table-Space-Scan und das willst
> du nicht.
>
> Was genau ist dein Problem? Du willst einen Datensatz
> einfügen,
falsch! ich möchte keinen Datensatz einfügen, ich suche einen Datensatz.
Bsp. (Personenliste)

+--+--------------------+------+
|ID|Date | Name |
+--+--------------------+------+
|1 + 2004-10-13 10:10:10| Karl |
+--+--------------------+------+

Karl hat die Personennummer 2004000001.
Dieser Nummer gibts es aber in der DB nicht sondern wurde von mir aus
der ID und dem Datum(das Jahr) gebildet

Bisher habe ich die db ausgelesen, die Personennummer gebildet und in
ein Array geschrieben und dann das Array nach der Personennummer
durchsucht. Funktioniert auch so einwandfrei aber bei einer höheren
Anzahl von Datensätzen geht das auf Kosten der Geschwindigkeit

Gibt es eine Möglichkeit nach der Personennummer direkt in der DB zu
suchen ohne eine neue Spalte nummer anzulegen?

dieser hat den PK JJJJnnnnnn und du moechtest nnnnnn
> bestimmen, so das du keine Kollisionen hast? Dann war meine
> Loesung korrekt. Obwohl ich dein Design fuer daneben halte.
> Ich würde eine Spalte char4 mit dem Jahr ablegen und die
> nummer als int. Das ganze dann als konkatenierten Schluessel.
>
> cu
> Rainer
>

Gruß Christian

Re: DB(mysql) nach gebildetem Wert durchsuchen

am 13.10.2004 12:39:52 von Rainer Huebenthal

Moin Christian Hoffart, du schriebst:

> falsch! ich möchte keinen Datensatz einfügen, ich suche einen Datensatz.
> Bsp. (Personenliste)
>
> +--+--------------------+------+
>|ID|Date | Name |
> +--+--------------------+------+
>|1 + 2004-10-13 10:10:10| Karl |
> +--+--------------------+------+
>
> Karl hat die Personennummer 2004000001.
> Dieser Nummer gibts es aber in der DB nicht

Dann gibt es nur eine Loesung: Füge ihn ein.

cu
Rainer

--
http://www.reisetraeume.com

Re: DB(mysql) nach gebildetem Wert durchsuchen

am 13.10.2004 15:52:43 von Uli Honal

Christian Hoffart wrote:

> +--+--------------------+------+
> |ID|Date | Name |
> +--+--------------------+------+
> |1 + 2004-10-13 10:10:10| Karl |
> +--+--------------------+------+
>=20
> Karl hat die Personennummer 2004000001.
> Dieser Nummer gibts es aber in der DB nicht sondern wurde von mir aus=20
> der ID und dem Datum(das Jahr) gebildet
> [..]
>=20
> Gibt es eine Möglichkeit nach der Personennummer direkt in der DB zu =

> suchen ohne eine neue Spalte nummer anzulegen?

Klar geht das. Zwei Möglichkeiten:

1.) Teile Deinen lustigen "Suchbegriff" (Personennummer) mit den=20
String-Funktionen[1] von PHP auf, bevor Du die SQL-Query=20
zusammensetzt, und formuliere daraus zwei WHERE-Bedingungen für die=20
Spalten ID und Date, verknüpfe sie mit AND.

2.) Benutze die Datums-[2] und Stringverknüpfungs-Funktionen[3] in=20
SQL, um die Werte aus den Spalten ID und Date nach dem beschriebenen=20
Schema zusammenzusetzen, und vergleiche mit der Personennummer.
Das ist die unschönere und vermutlich die langsamere Methode, da Dein=20
RDBMS das zunächst für alle Datensätze machen muss, und dann - ohne=
=20
Index - einen Vergleich darüber fährt.

..
WHERE CONCAT(YEAR(Date), LPAD(ID, 6 '0')) =3D '2004000001'


[1] z.B. http://de3.php.net/manual/en/function.substr.php
[2] http://dev.mysql.com/doc/mysql/en/Date_and_time_functions.ht ml
[3] http://dev.mysql.com/doc/mysql/en/String_functions.html


HTH,

-Uli.

Re: DB(mysql) nach gebildetem Wert durchsuchen

am 17.10.2004 00:38:13 von Niels Braczek

Christian Hoffart schrieb:

> ich habe eine Suche realisiert die ein Array nach einer Nummer
> durchsuchen kann. Diese Nummer setzt sich aus zwei DB werten zusammen.
> Zum einen aus einer eindeutigen ID und zum anderen aus einem
> Datum(Jahr), bspw. 2004000001,2004000002 usw..
> Da es diese Nummer so nicht in der DB gibt und erst gebildet werden
> muß, werden erst alle DB einträge + die gebildete Nummer in ein Array
> geschrieben welches ich dann durchsuchen kann. Bei einer höheren
> Anzahl an Datensätzen geht das natürlich auf Kosten der
> Geschwindigkeit.

Warum machst du das dann?

.... WHERE DATE(Jahr)=$jahr AND ID=$id

Sollte doch reichen.


> Nun meine Frage: Gibt es eine Möglichkeit nach dieser Nummer direkt in
> der DB zu suchen, bzw. die Nummer direkt in einer Abfrage zu
> erstellen?

Wenn diese Nummer in der Datenbank nicht vorkommt, hat sie in der
Abfrage doch auch nichts zu suchen!

MfG
Niels

--
Informatiker haben Humor, allerdings lässt sich der nur schwer
im Quelltext ausdrücken. Ausnahme Microsoft: Dort arbeiten die
Kabarettisten der Informatik, die sogar lustigen Quelltext schreiben
können. [Oliver Schad in dclpm]