Select A bis K - geht das?

MySQL, PostgreSQL, SQLite
sbrinkmann
Posts: 34
Joined: 2002-11-21 23:23
Location: Solingen

Select A bis K - geht das?

Post by sbrinkmann » 2003-04-08 22:38

Hallo!

Folgendes Problem: Ich habe eine MySQL Datenbank mit mehreren hundert Firmeneinträgen. Wenn ich die alle auf einer Seite ausgebe, wird die Seite zu "schwer" und daher würde ich das nun gerne auf mehrere Seiten verteilen. Jetzt kann ich hingehen und die Anzahl durchzählen und dann halbieren und die Daten verteilen. Dann muss ich aber eine "zurück"-"weiter"-Navigation einbauen, die nicht wirklich schön ist. Ich würde viel lieber eine Aufspaltung der Art "Firmen von A - K" und Firmen von "L - R" und "S-Z" machen. Dort wie sieht ein select aus, dass mir nur die Einträge gibt, bei denen "Firma" mit den Anfangsbuchstaben A bis K beginnt? Geht sowas überhaupt, muss ich für jeden Buchstaben einzeln abfragen oder wie mache ich sowas?

Vielen Dank!

dea
RSAC
Posts: 619
Joined: 2002-08-13 12:05

Re: Select A bis K - geht das?

Post by dea » 2003-04-08 23:54

hi sbrinkler ;)

rtfm as usual. Ich hab' denn mal geschaugt:
Aus http://www.mysql.com/doc/en/String_functions.html:
LEFT(str,len)
Returns the leftmost len characters from the string str:
mysql> SELECT LEFT('foobarbar', 5);
-> 'fooba'
Und besser noch: http://www.mysql.com/doc/en/String_comp ... tions.html recht weit unten "MATCH () AGAINST ()" Ich denke, das ist es noch am ehesten. Vor allem spart es DIr vetl. die WHERE-Clause ... ;)

gudn8

oxygen
RSAC
Posts: 2179
Joined: 2002-12-15 00:10
Location: Bergheim

Re: Select A bis K - geht das?

Post by oxygen » 2003-04-09 16:02

Ich benutzte für sowas LIMIT. Dann wird halt z.B. angezeigt, Einträge von 0-50, 50-100, 100-150 etc. Das garantiert das die Seiten gleich lang sind.

cye
Posts: 144
Joined: 2003-03-27 19:18
Location: Bayerischer Wald

Re: Select A bis K - geht das?

Post by cye » 2003-04-09 16:08

>wie sieht ein select aus, dass mir nur die Einträge gibt, bei
>denen "Firma" mit den Anfangsbuchstaben A bis K beginnt

select * from firmen where firmen.name between 'A%' and 'K%'

jtb
Posts: 599
Joined: 2002-08-18 16:41
Location: Darmstadt

Re: Select A bis K - geht das?

Post by jtb » 2003-04-09 16:22

dann bitte auch ein Partial Index..

dea
RSAC
Posts: 619
Joined: 2002-08-13 12:05

Re: Select A bis K - geht das?

Post by dea » 2003-04-09 16:23

Hab' noch mal geschmökert, Ergebnis:

SELECT a.name
FROM tabelle AS a
WHERE a.name REGEXP "^[a-k]"
ORDER BY a.name ASC;

Noch viel einfacher, war vorhin noch nicht sooo wach ;)

jtb
Posts: 599
Joined: 2002-08-18 16:41
Location: Darmstadt

Re: Select A bis K - geht das?

Post by jtb » 2003-04-09 16:30

ARGH, wie soll da noch der Datenbankserver was optimieren??

dea
RSAC
Posts: 619
Joined: 2002-08-13 12:05

Re: Select A bis K - geht das?

Post by dea » 2003-04-09 17:11

Jtb wrote:ARGH, wie soll da noch der Datenbankserver was optimieren??
"Optimieren" - was ist das? ;) *fg*

Im Ernst - ich bin kein DB-Profi. Außer ein bischen SQL-Wissen hab' ich (noch) keine Ahnung ... Aber erklär' doch mal, mich interessiert was Du mit optimieren meinst :)

[edit]
Ach so, rtfm kann ich noch ... :wink:
[/edit]

jtb
Posts: 599
Joined: 2002-08-18 16:41
Location: Darmstadt

Re: Select A bis K - geht das?

Post by jtb » 2003-04-09 17:27

mmh, sowas geht fast schon über RTFM hinaus..

also SQL-Tuning in ein paar Schritten:

Code: Select all

EXPLAIN SELECT * 
FROM schueler
WHERE name
BETWEEN 'A%' AND 'K%' 
Liefert possible_keys NULL, wenn für name kein Index definiert ist..

Siehe auch http://www.mysql.com/doc/en/MySQL_indexes.html:
Indexes are used to find rows with a specific value of one column fast. Without an index MySQL has to start with the first record and then read through the whole table until it finds the relevant rows. The bigger the table, the more this costs. If the table has an index for the columns in question, MySQL can quickly get a position to seek to in the middle of the datafile without having to look at all the data.
Diesselbe Query liefert possible_keys name, wenn du einen Index auf name legst.. Falls du ansonsten keinen Index auf name brauchst, solltest du die Länge des Index auf das benötigte Miniumum setzen!
Also

Code: Select all

KEY Name (Name(1))

die verwendete Form von Indices in MySQL sind B-Trees, die AFAIK keine RegExps unterstützen..[/code]

dea
RSAC
Posts: 619
Joined: 2002-08-13 12:05

Re: Select A bis K - geht das?

Post by dea » 2003-04-09 18:16

Danke, ist ja sehr interessant :) Ich kannte wohl das Prinzip der Inidzes, aber dass die Art des Index auch Auswirkungen auf die Such- und Abfragemethoden hat/haben kann wusste ich nicht.

Leider schweigt sich die MySQL-Doku (zumindest auf die Schnelle) über diese Themen aus. :/

Bedeutet das jetzt also, dass ich mit herkömmlichen WHERE-Statements performanter unterwegs bin als mit "eingebauten" Funktionen wie etwa REGEXP?

jtb
Posts: 599
Joined: 2002-08-18 16:41
Location: Darmstadt

Re: Select A bis K - geht das?

Post by jtb » 2003-04-09 18:19

ja..

RegExp vertragen sich nicht mit Indices..
The following SELECT statements will not use indexes:

mysql> SELECT * FROM tbl_name WHERE key_col LIKE "%Patrick%";
mysql> SELECT * FROM tbl_name WHERE key_col LIKE other_col;
PHPNuke hatte (?) mal ein paar starke Bremser in der Richtung..
Aber was von den Programmieren von PHP-Nuke zu halten ist, ist hier ja OFF-Topic..