webForumDet fria alternativet

En lagom klurig SQL fråga?

Databaser & SQLur Databashanterare & SQL

9 svar · 403 visningar · startad av Pellefant

Medlem sedan maj 20023 372 inlägg
Frågan#1

Hej!

Jag har detta. mySQL, PHP.

Tabell: Table1

Fält:
id int, unik, räknare
catid int
runnum int

Om catid = $a så sätt "cellen" där det högsta runnum finns till ett (1) och alla andra runnum celler ökas med ett(runnum=runnum+1)

(Om det finns flera runnum med samma högsta värde, sätt dem alla till 1)

$a är en variabel int. (om du inte är van med PHP, byt ut $a till tex "5" ovan, att få in variabeln rätt kan jag nog fixa)

mySQL, PHP

Enormt stort tack på förhand.

Medlem sedan dec. 200012 464 inlägg
#2

Jag skulle inte säga klurig, snarare obegriplig.

Det är mycket enklare om du visar lite exempeldata och vilket resultat du vill ha.

Medlem sedan maj 20023 372 inlägg
#3

Ojdå, sorry. Jag var nog lite otydlig.

Vi antar att $a=5

Exempeltabell:

id catid runnum
1 5 12
2 2 17
3 5 19
4 7 22
5 5 11

Detta gör att de rader där catid INTE är lika med 5 faller bort angående SQL satsen, kvar är...

id catid runnum
1 5 12
3 5 19
5 5 11

Nu letar vi efter det högsta runnumvärdet, vilket vi finner är 19, då sätter vi detta till 1 istället. De andra runnum ökar vi med 1.
(Om det hade varit flera med samma högsta värde hade alla fått 1)

Så resultatet blir:

id catid runnum
1 5 13
3 5 1
5 5 12

(Raderna med id 2 och id 4 rörs alltså inte)

Det var enklare att förklara med siffror. :)

Medlem sedan maj 20023 372 inlägg
#4

LarsG skrev:

Jag skulle inte säga klurig, snarare obegriplig.

Om jag hade kunnat ändra titeln ,så hade jag gjort det nu till "En lagom obegriplig SQL fråga" ;)

Medlem sedan dec. 200012 464 inlägg
#5

Eftersom det är mysql så får du ta det i flera steg

$q ="select max(numnum) as m from t
  where catid = $a";
$c = mysql_query($q);
   $r = mysql_fetch_array($c);
   $m = $r['m'];
   if ( !is_null($m) ) {
   $q = "update t set numnum = case when numnum = $m then 1 else numnum + 1 end where catid = $a";
   mysql_query($a);
}

Obegriplig var nog lite mycket sagt. Jag hade nog gissat att det var så du ville ha men det skadar inte att vara tydlig.

Det är säkert något fel i min PHP-kod men principen borde vara ok.

Medlem sedan maj 20023 372 inlägg
#6

Tack, det var jättesnällt. Nu har jag lite att laborera med. :)

P.s, vad betyder essentitia preter non sans multiplicandum ? *nyfiken*

Medlem sedan maj 20023 372 inlägg
#7

Hej! :)

Nu har det nog glidit över att bli mer en PHP fråga.

Jag har fyra poster(de enda i databasen) där catid är 9, och således borde runnum ändras hos dessa, men ingenting alls händer, inget felmeddelande heller. Någon som har en aning?

$a=9; 
$q ="select max(runnum) as m from galset where catid = $a"; 
$c = mysql_query($q); 
$r = mysql_fetch_array ($c); 
$m = $r['m']; 
if(!is_null($m) ) { 
   $q = "update galset set runnum = case when runnum = $m then 1 else runnum + 1 end where catid = $a"; 
   mysql_query($a); 
   }
Medlem sedan dec. 200012 464 inlägg
#8

Du får väl lägga till lite testutskrifter för att se vad som händer.

$a=9; 
$q ="select max(runnum) as m from galset where catid = $a"; 
echo "Select query " . $q . "<br>";
$c = mysql_query($q); 
$r = mysql_fetch_array ($c); 
$m = $r['m']; 
echo "max from galset " . $m . "<br>";
if(!is_null($m) ) { 
   $q = "update galset set runnum = case when runnum = $m then 1 else runnum + 1 end where catid = $a"; 
   echo "Update query " . $q . "<br>"
   mysql_query($q); // bytt $a mot $q här
   }
Medlem sedan maj 20023 372 inlägg
#9

Aha, ska göra det, jag är helt kass på denna felhantering, men lär mig eftersom. Tack för exemplen på hur man gör.

Medlem sedan maj 20023 372 inlägg
#10

Hej!

Med din kod ovan så funkade det helt plötsligt LarsG. Tack så hemsk mycket för ditt engagemang.

Här är utdatan:
Select query select max(runnum) as m from galset where catid = 9
max from galset 4
Update query update galset set runnum = case when runnum = 4 then 1 else runnum + 1 end where catid = 9

*Glad* :)

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