Toon posts:

[MySQL] dubbel sorteren

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo Allemaal,

Ik weet niet of dit mogelijk is dus ik vraag het hier maar:

Ik heb 15 artikelen en op de voorpagina komen de laatste 10 te staan door middel van deze query:

<?
$result = sql_query("SELECT sid, catid, title FROM artikelen $qdb $querylang ORDER BY sid desc limit 10 ", $dbi);
?>

op zich geen probleem, hij laat nu artikel 5 t/m 15 zien met de nieuwe artikelen bovenaan. Nu wil ik dat de nieuwe artikelen onderaan zet dus ik had uit de query "desc" gehaald. nu zet hij de nieuwe artikelen onderaan alleen laat hij nu artikel 1 t/m 10 zien.

Voorbeeld:
sid 15 artikel 15
sid 14 artikel 14
t/m
sid 6 artikel 6
sid 5 artikel 5

Maar ik wil dit:

sid 5 artikel 5
sid 6 artikel 6
t/m
sid 14 artikel 14
sid 15 artikel 15

En als ik desc nu weghaal krijg ik:

sid 1 artikel 1
sid 2 artikel 2
t/m
sid 9 artikel 9
sid 10 artikel 10

Dus ik wil de laatste 10 maar dan i.p.v. de nieuwe bovenaan. de nieuwe onderaan zoals:

sid 5 artikel 5
sid 6 artikel 6
t/m
sid 14 artikel 14
sid 15 artikel 15

Is er een mogelijkheid dat hij de laatste 10 artikelen pakt en dat hij deze dan weer sorteert de oudste bovenaan en de nieuwste onderaan ?

bedankt alvast voor jullie hulp en alvast een fijn weekend toegewenst voor iedereen

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:35
Ik denk dat je het met 2 querys zult moeten oplossen:
Eerst de id's ophalen van de 10 laatste artikelen, die artikelen ophalen en deze dan sorteren.
(Als je het nu niet in MySQL wilt doen, dan is het wel mogelijk met 1 query. :+ )

https://fgheysels.github.io/


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
http://www.mysql.com/doc/en/SELECT.html ( let op de LIMIT Syntax)
LIMIT kan ook twee parameters aannemen, namelijk zijn begin positie (offset) en het aantal rows wat hij moet laten zien
zo geeft
code:
1
select blah from boeh LIMIT 5, 10

10 rows terug, waarbij hij begint bij de vijfde row (dus 5 t/m14 dus :)
Als je dan de boel ASC sorteert, dan heb je wat je wilt :)

edit:
Dit werkt dus NIET! als je niet weet hoeveel rows je in je talbe hebt staan. Dan moet je eerst een rowcount uitvoeren

[ Voor 16% gewijzigd door Glimi op 29-11-2002 14:36 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 12:58
Hier is al eens een topic over geweest, maar die kan ik helaas met de search (zelfs de goede van ACM) niet vinden.

Ik denk dat de conclusie geweest zou zijn, dat het met MySQL niet in één query kan, en dat je dus ofwel je rijen in je applicatie moet sorteren, ofwel een temporary table aan moet maken op basis van deze query. Met een andere databaseserver zou je waarschijnlijk een subquery gebruiken, maar dat is met MySQL helaas niet mogelijk.

Alle methoden zijn redelijk efficient, omdat het aantal rijen al beperkt is door de eerste query, maar de uitvoering ervan is wel wat ingewikkelder. Misschien dat iemand anders nog een betere suggestie (of geheugen) heeft...

Verwijderd

Topicstarter
Ka ok maar er komen meer artikelen bij dus dan werkt dit niet meer, Het kan dus niet in 1 query ik moet er echt 2 van maken uds?

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:35
Soultaker: ik denk dat die temp. table oplossing de beste en misschien ook wel de eenvoudigste is. (Ik denk dat ik dat toen ook in dat andere topic gezegd had).
Gewoon
code:
1
2
3
insert into temp_table
select * from tabel WHERE .... LIMIT ...
select * from temp_table ORDER BY ...

https://fgheysels.github.io/


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Verwijderd schreef op 29 november 2002 @ 14:37:
Ka ok maar er komen meer artikelen bij dus dan werkt dit niet meer, Het kan dus niet in 1 query ik moet er echt 2 van maken uds?

Probleem is wel dat de boel dan niet echt thread safe is. Stel dat je eerst een rowCount query doet, daarna doet een andere thread een row toevoegen en daarna doe jij je select, dan heb je de laastste toevoeging er niet bij.

Maar om eerlijk te zijn lijkt dat me niet zo'n heel erg groot probleem voor een simpel CMS'je

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:35
Glimi schreef op 29 november 2002 @ 14:42:
[nohtml]
[...]
[/nohtml]
Probleem is wel dat de boel dan niet echt thread safe is. Stel dat je eerst een rowCount query doet, daarna doet een andere thread een row toevoegen en daarna doe jij je select, dan heb je de laastste toevoeging er niet bij.

Maar om eerlijk te zijn lijkt dat me niet zo'n heel erg groot probleem voor een simpel CMS'je


En als je dat geheel nu in een SP steekt en gebruikt maakt van locking oid?

https://fgheysels.github.io/


Verwijderd

Waarom doe je niet het volgende:
1) doe de query, waarbij je de gegevens in een verkeerde volgorde zet
2) zet deze gegevens in een array (eenvoudig met http://www.php.net/manual/en/function.mysql-fetch-array.php)
3) lees de array achterstevoren uit (of gebruik een ingebouwde PHP functie: http://www.php.net/manual/en/function.array-reverse.php)

Succes :)

[ Voor 12% gewijzigd door Verwijderd op 29-11-2002 14:57 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 12:58
whoami schreef op 29 November 2002 @ 14:42:
En als je dat geheel nu in een SP steekt en gebruikt maakt van locking oid?
Daar win je niets mee. Het kan altijd voorkomen dat er een rij wordt toegevoegd ergens tussen het uit de database halen van de gegevens en het weergeven op jouw scherm. Daar doe je niets aan.

Zelfs als je je gehele database locked tot al je gegevens zichtbaar zijn, kan het goed zijn dat net daarna iets gewijzigd wordt en dan zijn je gegevens toch weer outdated. Daar ontkom je niet aan.

Als ook het verwijderen van rijen een issue is, is de methode met een temporary table echter een stuk robuuster dan die met rijen tellen, in die zin dat je dan (indien mogelijk) wel precies genoeg rijen krijgt.

[ Voor 16% gewijzigd door Soultaker op 29-11-2002 14:47 ]


Verwijderd

Topicstarter
Oeps ik dacht dat ik er wel wat van af wist maar blijkt nu dat ik nog een lange weg heb te gaan.

Ok paar vraagjes:
deze temp_table moet dus ook daadwerkelijk in de database te vinden zijn?
En stel nou dat ik die insert uitvoer, dan schrijft hij er 10 in weg, als de volgende dan komt overschrijft hij dan die 10 of zet hij er 10 bij?

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
whoami schreef op 29 november 2002 @ 14:42:
En als je dat geheel nu in een SP steekt en gebruikt maakt van locking oid?
http://www.mysql.com/products/mysql-4.0/index.html MySQL :X zou pas die boel gaan ondersteunen vanaf versie 4.1

[ Voor 10% gewijzigd door Glimi op 29-11-2002 14:48 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 19:35
Verwijderd schreef op 29 november 2002 @ 14:47:
Oeps ik dacht dat ik er wel wat van af wist maar blijkt nu dat ik nog een lange weg heb te gaan.

Ok paar vraagjes:
deze temp_table moet dus ook daadwerkelijk in de database te vinden zijn?
En stel nou dat ik die insert uitvoer, dan schrijft hij er 10 in weg, als de volgende dan komt overschrijft hij dan die 10 of zet hij er 10 bij?


Dat hangt ervanaf. Ik ben niet zo bekend met MySQL, maar in SQL Server heb je 2 soorten Temp tables. Globale en niet globale.
Als je een niet globale SP maakt binnen een SP (in SQL Server), dan wordt die tabel automatisch weer gedropped als de SP volledig teneinde is.
Je kunt natuurlijk zelf ook wel altijd die temp table gaan legen of droppen als je die niet meer nodig hebt.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Nee joh dat wordt dan veels te veel werk als je heel veel nieuwsposten krijg, kan je om de 5 min die temp_table gaan legen.

Hmmm dan wordt het toch maar de optie van 2 query's denk ik, dat is vast het makkelijkst

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Verwijderd schreef op 29 November 2002 @ 14:52:
Nee joh dat wordt dan veels te veel werk als je heel veel nieuwsposten krijg, kan je om de 5 min die temp_table gaan legen.

Hmmm dan wordt het toch maar de optie van 2 query's denk ik, dat is vast het makkelijkst

Temp tables zijn redelijk simpel in MySQL: http://www.mysql.com/doc/en/HEAP.html

Verwijderd

Ik raad nog steeds mijn 1 query, temp tables vrije oplossing van hierboven aan.

[ Voor 14% gewijzigd door Verwijderd op 29-11-2002 15:00 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 12:58
Temporary tables zijn onzichtbaar binnen andere sessies; anders waren het wel gewone tables. Je zult ze dus per keer moeten creeëren, vullen, uitlezen en verwijderen. Zoiets:

SQL:
1
2
3
4
5
6
CREATE TEMPORARY TABLE tmp TYPE = HEAP
        SELECT ... WHERE ...

SELECT * FROM tmp

DROP tmp


Al vermoed ik dat een temporary table vanzelf ook wel gedropt wordt, als de sessie afgesloten wordt. Het is echter wel zo netjes om 'm expliciet te droppen (zeker als je dit meerdere keren per sessie wilt doen).
Verwijderd schreef op 29 November 2002 @ 14:59:
Ik raad nog steeds mijn 1 query, temp tables vrije oplossing van hierboven aan.
Dat is inderdaad helemaal geen slechte keuze.

[ Voor 22% gewijzigd door Soultaker op 29-11-2002 15:03 ]


Verwijderd

Topicstarter
Nee ik weet het maar daar ben ik gisternacht tot 03:30 mee bezig geweest en ik kreeg alleen de sid in de omgedraaide volgorde

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 16:59

TeeDee

CQB 241

hmm, zit zo eens te kijken en te denken maar kan dit niet gewoon?

code:
1
SELECT TOP 10 sid, catid, title  FROM artikelen $qdb $querylang ORDER BY sid ASC

Of snap ik het hele probleem niet?

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

Topicstarter
TeeDee:

Nou heb dit geprobeerd maar krijg dan:
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 16:59

TeeDee

CQB 241

SELECT TOP 10 werkt dus blijkbaar niet in MySQL? MS SQL wel. Maar goed, dan zal je het toch met één van de oplossingen hierboven moeten stoeien!

Heart..pumps blood.Has nothing to do with emotion! Bored


  • whoami
  • Registratie: December 2000
  • Laatst online: 19:35
Tja, neem er even de manual bij, dan zul je zien dat je geen TOP moet gebruiken maar een LIMIT.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Thx TeeDee

Soultaker jouw oplossing ook geprobeerd:

PHP:
1
2
3
4
5
6
7
<?
//    CREATE TABLE tmp TYPE=HEAP SELECT sid, catid, aid, title, time, hometext, bodytext, comments, counter, topic, informant, notes, acomm, score, ratings FROM stories ORDER BY sid desc limit 10;
   
//    $result = sql_query("SELECT sid, catid, aid, title, time, hometext, bodytext, comments, counter, topic, informant, notes, acomm, score, ratings FROM tmp $qdb $querylang ORDER BY sid", $dbi);

//    DROP TABLE tmp;
?>


Parse error: parse error, unexpected T_STRING in /xxxxxx on line 61

edit:
Glimi: even [ php] tags toegevoegd (zonder spatie)

[ Voor 9% gewijzigd door Glimi op 29-11-2002 16:07 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 12:58
Uhm. Je moet er wel allemaal aparte SQL queries van maken, eh? Als je PHP fouten krijgt (zoals jij hier) dan ligt het zeker niet aan mijn voorstel, want ik zeg niets over PHP.

En als je alle kolommen wil hebben, doe dan gewoon "SELECT *" (zeker in de temporary table, die niet meer bevat dan wat je er zelf ingestopt hebt).

  • CyberJack
  • Registratie: Augustus 2002
  • Laatst online: 19-08 20:21
Ik heb even zitten knutsellen, en dit is er uit gekomen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
  $Result1=mysql_query("
    SELECT count(*)
    FROM artikelen
  ");
    list($totaal_berichten)=mysql_fetch_row($Result1);  
    $start_berichten = $totaal_berichten - 15; //het aantal weer te geven berichten
    
  $result2=sql_query("
    SELECT sid, catid, title
    FROM artikelen $qdb $querylang
    ORDER BY sid 
    LIMIT $start_berichten, $totaal_berichten ", $dbi);

ik heb alleen even niet afgevangen als er minder dan 15 berichten zijn, en ik gebruik mysql_query en niet sql_query. dus de laatste regel heb ik gewoon copy->paste en dan aangepast.

Suc6

https://bottenberg.dev


Verwijderd

Topicstarter
cyberjack dank je wel, ik heb het even aangepast naar het goede benamingen e.d.
dus het is nu zo:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
    $Result1=mysql_query(" 
    SELECT count(*) 
    FROM ".$prefix."_stories 
  "); 
    list($totaal_berichten)=mysql_fetch_row($Result1);   
    $start_berichten = $totaal_berichten - 15; //het aantal weer te geven berichten 
     
  $result=sql_query(" 
    SELECT sid, catid, aid, title, time, hometext, bodytext, comments, counter, topic, informant, notes, acomm, score, ratings 
    FROM ".$prefix."_stories  $qdb $querylang 
    ORDER BY sid  
    LIMIT $start_berichten, $totaal_berichten ", $dbi);



    while (list($s_sid, $catid, $aid, $title, $time, $hometext, $bodytext, $comments, $counter, $topic, $informant, $notes, $acomm, $score, $ratings) = sql_fetch_row($result, $dbi)) {
    if ($catid > 0) {
        list($cattitle) = sql_fetch_row(sql_query("select title from ".$prefix."_stories_cat where catid='$catid'", $dbi), $dbi);
    }
?>


Hij laat alleen nu helemaal niks meer zien, geen foutmelding maar ook geen artikelen

edit:
Glimi: Even [ php] (zonder spatie) toegevoegd

[ Voor 9% gewijzigd door Glimi op 29-11-2002 16:08 ]


Verwijderd

Topicstarter
Cyberjack sorry zoals je al zei als geen 15 artikelen instaan dan zie je niks, heb 15 veranderd in 5 en nu doet hij het wel, dank je wel. Nu kan ik lekker stappen het weekend i.p.v. weer eens achter de comp ;-)

  • CyberJack
  • Registratie: Augustus 2002
  • Laatst online: 19-08 20:21
als je tussentijds een echo doet van wat er in $totaal_berichten staat, wat krijg je dan te zien?

Als ik je werder wil helpen, zal ik me even in "sql_query" moeten verdiepen, want ik gebruik normaal alleen "mysql_query"

wat ik zo even zag is dat je by "sql_query" de database naam mee moet geven, en bij "mysql_query" moet deze van te voren al bekend zijn.... dus mischien ligt daar je probleem.

https://bottenberg.dev


  • CyberJack
  • Registratie: Augustus 2002
  • Laatst online: 19-08 20:21
je kan altijd nog even dit tussenvoegen

PHP:
1
2
3
4
if ($totaal_berichten < 0 )
{
  $start_berichten = 0;
}


dan heb je dat probleem niet meer

[ Voor 82% gewijzigd door CyberJack op 29-11-2002 16:17 ]

https://bottenberg.dev

Pagina: 1