02. januar 2004 - 23:29Der er
17 kommentarer og 1 løsning
traversering der ordner tal
Hejsa
Min hjerne er vist brændt lidt sammen, for det her volder mig lidt for mange problemer - men det er jo oz sent og nytårs aften sidder stadig i baghovedet...
Anyways, here goes: Jeg har lavet en venteliste til min andelsboligforening i php (gad ikke skrive 78 adresse sedler i hånden, så nu ordner puteren det...) I min tabel findes feltet "nr" som er en int. Den første person i listen har "nr == 1" og så fremdeles... Mit problem er at få lavet en funktion som ser nogenlunde sådan ud: function fixList($nr){ $sql = "select nr from liste"; //nr == det nummer som er fjernet fra listen. e.g. 33 pseudokode: fra $nr sæt: $nyt_nr = ($nr + 1) //e.g. bliver personen på plads 34 nu sat på plads 33 dvs. noget med: "update liste set nr = '$nyt_nr' WHERE nr = '$nr'"; forsæt indtil listen er tom $nr++; //da næste i rækken nu må være 34
}
Håber I kan gennemskue min pseudokode, men jeg er sku' kørt lidt fast i hvordan det gøres på den smarteste måde... Ovenstående resulterer i adskillige kald til databasen... kan det gøres i et kald (SQL)???
Brug af AI afslører de svagheder, virksomheder allerede har opbygget gennem års cloud-transformation, nye SaaS-løsninger og fragmenterede sikkerhedssystemer.
swag >> Hvorfor gøre sådan? Hvorfor ikke bare give dem et fortløbende nummer (autonummerering i MySQL) - og så sortere efter nummeret, når du henter fra databasen? Så har du dem altid i den rigtige rækkefølge, selvom nogle skulle være slettet :)
--> Ole: true, true, men jeg vil gerne, eller dvs. dem der står på listen vil gerne, vide hvilken placering de har - hence deres nr i tabellen, derfor er det vigtigt, at "nr" altid er up-2-date.
--> tefcke: umiddelbart er din løsning den samme som den jeg havde i tankerne, problemet er blot, at der opstår følgende fejl: #1062 - Duplicate entry '5' for key 1
Det pudsige er, at fejlen opstår forskellige steder, har oplevet at det i en tabel med 71 numre først gik galt ved nr 48 - meget mærkeligt!
det hjælper ikke at re-connecte til databasen (havde håbet den måske ville flushe den tidligere record, således duplikatet ungås - hvis altså det er det der er problemet...
swag >> Det er da noget vrøvl - du kan ligeså let give dem nummeret, når du bladrer record-settet igennem. Det er den måde resten af verden gør det på ... og det er der nok mere end én god grund til, skal du se ;o) /mvh
Løsningen på problemet er: UPDATE liste SET nr = nr - 1 WHERE nr > $nr ORDER BY nr ASC;
Men jeg er da tilbøjelig til at give dig ret alligevel :O) Hvilket får mig til at tænke på en anden lille detalje, nemlig spørgsmålet om hvilken teknik der egner sig bedst til kommunikation med databasen... 1. Åbne/lukke i samme sekund man fyre en mysql_query(...) af 2. Åbne først lave x antal mysql_query(...), lukke
2 egner sig vel bedst i en løkke... ellers bliver det vældigt mange åbne/lukke kald...
Ehhh ... så må jeg vist slå ordet 'jorde' op ...?!!???
Naturligvis kan man (ekstremt sjældent) få brug for at opdatere en MySQL-tabel på denne måde - men det har du overhovedet ikke brug for.
$sql = "SELECT `navn` FROM `TABELNAVN` ORDER BY `nr`"; $res = mysql_query( $sql ); $inx = 0; while ( $row=mysql_fetch_assoc($res) ) { $inx++; $str .= $row["navn"]." er nummer: ".$inx."<br>\n"; } print $str;
Det er det hele, du har brug for. Hvad angår connections, så nøjes med én - og foretag så dine forespørgsler. Du behøver ikke at lukke den igen. Den lukker automatisk, når scriptet er kørt færdigt. /mvh
ORDER BY nr ASC Ahhh, klart klart, ellers er der jo chance for at du for dubletter (hvis 'nr' altså er primary eller unique) ... godt du fandt ud af det!
Det ændrer ikke ved, det er en grundlæggende misforståelse af MySQL at begynde at lave den slags 'oprytninger' i denne slags situationer. Hvorfor overhovedet gøre det?
Synes godt om
Slettet bruger
03. januar 2004 - 20:47#13
Hvorfor ikke lave en tæller når listen udskrives til skærmen, som starter på 1, og så stiger efterhånden som personerne listes.
$query_antal = mysql_query("SELECT COUNT(*) FROM TABELNAVN");
if (mysql_result(($query_antal),0) < 1) { // Fejl... ingen navne i tabellen... } else { $query_navne = mysql_query("SELECT navn FROM TABELNAVN ORDER BY nr ASC");
kfisker >> Ehhh ... der er vel ingen grund til at lave det mindre effektivt, end det allerede er foreslået (03/01-2004 05:14:21). Dit første SQL kald er helt overflødigt :) /mvh
Synes godt om
Slettet bruger
03. januar 2004 - 20:57#15
olebole...> Nej, med mindre du gerne vil have en anden besked på skærmen, såfremt der ikke er nogle oprettet i tabellen.
Om man så vil bruge en if-sætning eller en count direkte i tabellen er vel en smagssag.......
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.