webForumDet fria alternativet

LEFT(), men ändå inte

7 svar · 284 visningar · startad av K@llen

K@llenMedlem sedan mars 20032 667 inlägg
#1

Hej,

Jag har en sql-fråga som ser ut så här:

$sql = "SELECT a.articleId, a.subject, LEFT(a.copy, 180) AS copy, a.pubDate, u.userId 
FROM Article a
INNER JOIN User u
ON a.authorId = u.userId
ORDER BY " . $order . " DESC 
LIMIT 5";

Nu hugger den som väntat texten exakt efter 180 tecken. Detta blir ganska fult. Kan jag i MySQL men någon strängfunktion välja efter antal ord från vänster? Eller på annat smart sätt slippa avhuggna ord.

Detta är kanske något jag får fixa i PHP, men dumt att hämta hela texten om jag bara ska använda ca 180 tecken.

mvh jörgen

cyprysMedlem sedan dec. 20003 563 inlägg
#2

Kan du inte bara hämta drygt 180 tecken och sen hugga av texten vid sista mellanrummet i strängen?

LarsGMedlem sedan dec. 200012 464 inlägg
#3
select substring(str from 1 for 
case when position(' ' in str) = 0 then 180
     else 180 - position(' ' in reverse(str)) end)
from t
K@llenMedlem sedan mars 20032 667 inlägg
#4

Hej igen,

Tack för era svar. Jag får dock inte det att fungera riktigt. Första biten i texten:

Sveriges Television och Sveriges Radio har båda beslutat att börja sända digitala sändningar istället för analogt. Jag anser att det är ett hot mot säkerheten och integriteten.

SQL-fråga som den ser ut nu:

$sql = "SELECT substring(a.copy from 1 for 
case when position(' ' in a.copy) = 0 then 180
else 180 - position(' ' in reverse(a.copy)) end) AS copy
FROM Article a
INNER JOIN User u
ON a.authorId = u.userId
ORDER BY " . $order . " DESC 
LIMIT 5";

Resultat:

Sveriges Television och Sveriges Radio har båda beslutat att börja sända digitala sändningar istället för analogt. Jag anser att det är ett hot mot säkerheten och i

LarsGMedlem sedan dec. 200012 464 inlägg
#5
$sql = "SELECT substring(a.copy from 1 for 
case when char_length(a.copy) <= 180 then char_length(a.copy) 
when position(' ' in a.copy) = 0 then 180
else 180 - position(' ' in reverse(a.copy)) end) AS copy
FROM Article a
INNER JOIN User u
ON a.authorId = u.userId
ORDER BY " . $order . " DESC 
LIMIT 5";
K@llenMedlem sedan mars 20032 667 inlägg
#6

Tack LarsG, men det blir tyvärr exakt samma resultat. :(

LarsGMedlem sedan dec. 200012 464 inlägg
#7
SELECT substring(a.copy from 1 for
case when char_length(a.copy) <= 180 then char_length(a.copy)
when position(' ' in a.copy) = 0 then 180
else 180 - position(' ' in reverse(substring(a.copy from 1 for 180))) end) AS copy   
FROM artikel as a;
K@llenMedlem sedan mars 20032 667 inlägg
#8

Vad skulle man göra utan ett geni som LarsG? ;)

Tusen tack, hoppas jag kan få tillfälle att hjälpa dig någon gång. :bire

130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)