Re: BETWEEN funktioniert nicht richtig...
am 26.07.2006 13:01:41 von Helmut Chang
Christoph Söllner schrieb:
> Jetzt moechte ich mittels mysql
> die Datensaetze haben, wo der Nachname mit A, B oder
> C beginnt;
Warum tust du das dann nicht?
> WHERE UPPER(nachname) BETWEEN 'A%' AND 'C%'
Bedeutet AFAIK dasselbe wie:
WHERE UPPER(nachname) >= 'A%' AND UPPER(nachname) <= 'C%'
Du willst aber:
WHERE erster_Buchstabe_des_Nachnamens BETWEEN 'A' AND 'C'
Wie das geht, sagt dir das MySQL-Manual.
Abgesehen davon ist kein PHP-Problem zu erkennen, deshalb X'Post und
F'Up nach de.comp.datenbanken.mysql
gruss, heli
Re: BETWEEN funktioniert nicht richtig...
am 26.07.2006 16:06:33 von Sven Paulus
Alex Hepp wrote:
> Wenn ich einfach mal voraussetze, dass der OP eben doch PHP einsetzt,=20
> und damit die Werte aus der Maske bekommt, gibt es mehrere Lösungen,=20
> eine hab ich mal skizziert (tatsächlich sollte die sogar so=20
> funktionieren ;))
Aus Userinput nicht escaped Queries zusammenzubauen ist _nie_ eine
Loesung.
> $letter2 =3D chr(ord($letter2)-1);
Damit faellst Du auf EBCDIC-basierenden Systemen auf die Nase.
Re: BETWEEN funktioniert nicht richtig...
am 26.07.2006 16:07:02 von Alex Hepp
Helmut Chang schrieb:
> Abgesehen davon ist kein PHP-Problem zu erkennen, deshalb X'Post und
> F'Up nach de.comp.datenbanken.mysql
>
> gruss, heli
Wenn ich einfach mal voraussetze, dass der OP eben doch PHP einsetzt,
und damit die Werte aus der Maske bekommt, gibt es mehrere Lösungen,
eine hab ich mal skizziert (tatsächlich sollte die sogar so
funktionieren ;))
Du regelst das einfach über PHP, indem Du einfach ein mit OR
verknüpftest LIKE für jeden Buchstaben mit Wildcard an die where clause
anhängst.
Bsp.:
// REGISTER_GLOBALS off, fetch 2 letters, only upper case letters
$letter1 = strtoupper($_POST['letter1']);
$letter2 = strtoupper($_POST['letter2']);
// build query
$where = "where TO_UPPER(NACHNAME) LIKE '{$letter1}%'";
while($letter2 > $letter1){
// decrement letter
$letter2 = chr(ord($letter2)-1);
$where .= " OR TO_UPPER(NACHNAME) LIKE '{$letter2}%'";
}
die andere wäre eben obiger Ansatz, nur den ersten Buchstaben des
Nachnamens mit deinem eigenen Buchstaben zu vergleichen, in diesem Fall
funktioniert dann auch dein between, aber dann ohne wildcards.
HTH
alex