Avatar billede 4u2x Nybegynder
03. januar 2005 - 16:03 Der er 12 kommentarer og
1 løsning

DISTINCT på en forkortet tekst

SELECT id,spm,dato,CONCAT(LEFT(spm,16),IF(LENGTH(spm)>16,'...','')) AS spm2 FROM forum ORDER BY id DESC LIMIT 2


Som I kan se har jeg forkortet "spm" så jeg kun får maksimum 16 tegn fra den... jeg vil dog også gerne bruge DISTINCT så jeg ikke en med samme spm.... en der kan fixe noget?  :)
Avatar billede fennec Nybegynder
03. januar 2005 - 16:17 #1
Distinct virker på ALLE felter på select listen, og da jeg går ud fra at ID er et autonummer vil Distinct ikke have nogen virkning, sålænge at ID'et er med på selecten. Du kan heller ikke tage den fulde udgave af spm med, og sikkert heller ikke dato. Du har derfor kun dette tilbage, hvis du vil bruge distinct.

SELECT distinct CONCAT(LEFT(spm,16),IF(LENGTH(spm)>16,'...','')) AS spm2 FROM forum ORDER BY id DESC LIMIT 2

.... Og det er nok ikke det du er ude efter. Da du sikkert vil have de andre felter med også.
Avatar billede 4u2x Nybegynder
03. januar 2005 - 16:25 #2
Man kan vel også bare hente de felter man skal bruge og så bruge en anden php-funktion som kan snuppe de første 16 tegn og så en funktion som kan tjekke om der overhovdet er mere end 15 tegn i "spm"-værdien før tager de første 15 tegn og slutter det af med "..." til sidst.. 

Et lille eksempel til dem der ikke helt forstår det ovenstående :)

if($spm > 15)
{
  $spm =($spm,0,15);    <-- kan ikke huske funktionen
  $spm .= "...";
}
else
{
  $spm = $spm;
}
Avatar billede fennec Nybegynder
03. januar 2005 - 16:38 #3
Jeps. Det er også en meget bedre løsning.

Jeg kan faktisk heller ikke huske den funktion, men den kan sikkert findes på php.net

Du skal dog lige have ændret:
if($spm > 15)

til:
if(strlen($spm) > 15)
Avatar billede 4u2x Nybegynder
03. januar 2005 - 16:46 #4
if(strlen($spm) > 15)
{
$rest = substr($spm, 0, 15);
$spm = $rest."...";
}


vupti :D
Avatar billede 4u2x Nybegynder
03. januar 2005 - 16:52 #5
nu mangler jeg bare at få min mysql_query til at funke :)

SELECT id,DISTINCT(spm),dato FROM forum ORDER BY id DESC LIMIT 2

kommer med fejl


You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'DISTINCT(spm),dato FROM forum ORDER BY id DESC LIMIT 2' at line
Avatar billede 4u2x Nybegynder
03. januar 2005 - 17:08 #6
fennec ?

en du kan kringle? :)
Avatar billede fennec Nybegynder
04. januar 2005 - 08:48 #7
Som sagt virker distinct på ALLE elementer. Men kan ikke lave distinct på kun et element. Syntaxen er derfor:

SELECT DISTINCT id, spm, dato FROM forum ORDER BY id DESC LIMIT 2

Men som jeg også var lidt inde på i min første post, vil distinct ikke have nogen effekt på denne select, da ID sikkert er et autonummer.
Avatar billede 4u2x Nybegynder
04. januar 2005 - 15:17 #8
den vil jo have effekt på DATO... som nok er grunden til at den stadig fejler.... der er jo et unikt tal i hver DATO-række.
Avatar billede fennec Nybegynder
04. januar 2005 - 15:29 #9
Det er netop derfor man ikke altid kan bruge distinct, som man gerne vil. Du kan enten fjerne de kolonner, som driller, fra select listen, eller programmere dig ud af det (hvis man ellers kan).
Avatar billede fennec Nybegynder
04. januar 2005 - 15:30 #10
Det skulle ikke være et svar...
Avatar billede 4u2x Nybegynder
04. januar 2005 - 17:27 #11
hmm... ingen ide til hvordan man kan smutte uden om?

det virkede engang med bare at sætte parentes om "spm" og så var de andre uberørt :-/
Avatar billede fennec Nybegynder
05. januar 2005 - 11:20 #12
... Det har nok mere været et tilfælde at det virkede. Ingen af de databaser typer jeg har brugt, kan man bruge distinct på et specifikt element, og lade de andre uberørt. Prøv at se dette eks:

MinTabel
ID tekst1 tekst2
1 "hejsa" "test"
2 "hejsa" "ksdf"

Med: "select id, distinct(tekst1), tekst2 from MinTabel" har databasen ingen mlighed for at vide hvilket ID og tekst2 den skal tage med, da begge rækker passer på distinct(tekst1).

Det kan dog laves over flere selects.

$res1 = "select distinct(tekst1) from MinTabel"
for($res1......)
{
  £res2 = "select * from MinTabel where tekst1='$res1[0]' limit 1"
  echo $res2
}

Håber du forstår ideen med den meget korte kode :o)
Avatar billede 4u2x Nybegynder
06. januar 2005 - 20:21 #13
har lavet en anden løsning, og brugte så:

if(strlen($spm) > 15)
{
$rest = substr($spm, 0, 15);
$spm = $rest."...";
}


lukker spm... du får bare point'ne fennec :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester