Fallunterscheidung

Fallunterscheidung

am 09.01.2005 17:59:31 von Katharina Punkt

Ich arbeite gerade an einer Musikdatenbank. Mit folgender Abfrage
lasse ich mir sämtliche Titel anzeigen, die mit dem Anfangsbuchstaben
$letter beginnen:

SELECT artist,title,filename FROM music WHERE
SUBSTRING(title,1,1) = '$letter' ORDER BY title");

Soweit alles ganz einfach. Nur haben einige Künstler, allen voran
Elvis, die Marotte, ihren Songtiteln einen Part in Klammern voran-
zustellen, z.B. "(You're the) Devil in Disguise".

Dieser Titel sollte aber nicht unter dem Anfangsbuchstaben "(",
sondern unter "Y" einsortiert werden. Gibt es ein MySQL-Statement
à la

IF SUBSTRING(title,1,1) = '(' {
SELECT ... FROM music WHERE SUBSTRING(title,2,1) = '$letter'
} ELSE {
SELECT ... FROM music WHERE SUBSTRING(title,1,1) = '$letter'
}

?

Katharina.

Re: Fallunterscheidung

am 09.01.2005 18:16:49 von Patrick Eggert

Hallo Katharina.

Wie wär's denn mit folgendem Statement?

SELECT ... FROM music WHERE SUBSTRING(title,1,1) = '$letter'
OR (SUBSTRING(title,1,1) = '(' AND SUBSTRING(title,2,1) = '$letter');

Oder habe ich da jetzt einen Denkfehler? :-)

Viele Grüße,
Patrick



Katharina Punkt wrote:

> Dieser Titel sollte aber nicht unter dem Anfangsbuchstaben "(",
> sondern unter "Y" einsortiert werden. Gibt es ein MySQL-Statement
> à la
>
> IF SUBSTRING(title,1,1) = '(' {
> SELECT ... FROM music WHERE SUBSTRING(title,2,1) = '$letter'
> } ELSE {
> SELECT ... FROM music WHERE SUBSTRING(title,1,1) = '$letter'

Re: Fallunterscheidung

am 09.01.2005 18:28:21 von Katharina Punkt

Patrick Eggert schrieb;

> Wie wär's denn mit folgendem Statement?
>
> SELECT ... FROM music WHERE SUBSTRING(title,1,1) = '$letter'
> OR (SUBSTRING(title,1,1) = '(' AND SUBSTRING(title,2,1) = '$letter');
>
> Oder habe ich da jetzt einen Denkfehler? :-)

Kein Denkfehler, funktioniert genauso wie es soll.
Besten Dank!

Katharina.

Re: Fallunterscheidung

am 09.01.2005 18:29:26 von Patrick Eggert

Hallo nochmal.

Ohne besonders viel Ahnung davon zu haben, wie MySQL Operationen
ausführt, könnte ich mir vorstellen, dass folgendes effizienter ist:
Angenommen, Du suchst nach dem Anfangsbuchstaben Y:

SELECT ... FROM music WHERE title LIKE 'Y%' OR title LIKE '(Y%';

Kürzer ist es jedenfalls ;-)

Grüße,
Patrick



Patrick Eggert wrote:

> Wie wär's denn mit folgendem Statement?
>
> SELECT ... FROM music WHERE SUBSTRING(title,1,1) = '$letter'
> OR (SUBSTRING(title,1,1) = '(' AND SUBSTRING(title,2,1) = '$letter');

Re: Fallunterscheidung

am 09.01.2005 18:39:49 von Markus Mann

Katharina Punkt wrote:
> Ich arbeite gerade an einer Musikdatenbank. Mit folgender Abfrage
> lasse ich mir sämtliche Titel anzeigen, die mit dem Anfangsbuchstaben
> $letter beginnen:
>
> SELECT artist,title,filename FROM music WHERE
> SUBSTRING(title,1,1) = '$letter' ORDER BY title");
>
> Soweit alles ganz einfach. Nur haben einige Künstler, allen voran
> Elvis, die Marotte, ihren Songtiteln einen Part in Klammern voran-
> zustellen, z.B. "(You're the) Devil in Disguise".
>
> Dieser Titel sollte aber nicht unter dem Anfangsbuchstaben "(",
> sondern unter "Y" einsortiert werden.

Dann normalisiere deine Daten (also raus mit Sonderzeichen und
ähnlichem).

Als Anregung:
select title, replace(title,'(','') sort
from music
where substring(replace(title,'(',''),1,1) = '$letter'
order by sort

Dabei ist zu beachten, dass weder deine Version noch die meine einen
Index nutzen kann (weil schon vor dem Operator eine Funktion verwendet
wird). Es läuft also immer auf einen Full Table Scan hinaus (explain
sollte dir das bestätigen).

> Gibt es ein MySQL-Statement
> à la
> [...IF...]

Da ließe sich bestimmt auch etwas basteln, scheint mir aber noch
fragwürdiger als replace.

Ciao.
--
Markus Mann
];-)