Hoi iedereen,

Ik heb een spellensysteem, en nu wil ik bij de categorieën limiteren op bijv. 20 spellen. Dat is simpel (LIMIT 0,20).

Maar ik wel dat hij de 20 nieuwste spellen dan laat zien. Da's ook niet moeilijk (ORDER BY toegevoegd DESC).

Nu komt het probleem. Ik heb deze query dus:

SELECT ID, naam, bestand, bestandstype, toegevoegd FROM spellen WHERE categorie = 'Avontuur' ORDER BY toegevoegd desc LIMIT 0, 10


En deze PHP-code om de gamebox te maken:


<td align="left" width="201" class="gamebox"><br>
    <!-- Avontuur -->
    <ul>
    <?php
    while ($avontuur = mysql_fetch_array($avontuurquery, MYSQL_ASSOC)) {
    list(, $klein) = explode(",", $avontuur['bestandstype']);
    ?>
<li><a href="index.php?pagina=spellen&amp;actie=speel&amp;ID=<?php echo $avontuur['ID']; ?>" onmouseover="return mouseoverimage('<?php echo $avontuur['naam']; ?>', '<?php echo $avontuur['bestand'].".".$klein; ?>')" onmouseout="return mouseout()"><?php echo stripslashes(htmlentities($avontuur['naam'])); ?></a><?php 
if (strtotime($avontuur['toegevoegd']) >= time() - 84600) { echo " <span class=\"nieuw\">Nieuw!</span>"; } ?></li>
    <?php } ?></ul>
</td>


Nu wil ik alleen nog dat de namen op alfabetische volgorde worden weergeven. Ik kan het niet meer in de query doen, want daar zit al een ORDER BY in, en ook niet met de phpfunctie sort(), want ik voer een while loop uit.

Wie kan mij helpen om de namen in alfabetische volgorde te laten zien?
en als je de limit gewoon op het einde zet (buiten de sub-query) ?
Uiteraard kun je ook sorteren met PHP, maar dat is vrij omslachtig. Je kunt dat veel sneller in de database doen, die is gemaakt voor dit soort dingen.

Maar zit je echt met handen en voeten gebonden aan MySQL? Al dit gekloot is namelijk nergens voor nodig. Stap gewoon over op pgSQL en vele problemen verdwijnen als sneeuw voor de zon.
Limit buiten de subquery werkt natuurlijk niet, dan sorteert hij nog niet op alfabet.

En sorteren met PHP is idd erg omslachtig, maar het is niet anders.

Ik heb al zo'n 15000 regels code geschreven, alles in combinatie met MySQL database. Ik kan dus niet zomaar overstappen naar pgSQL.
15000 regels code zegt niks, zeker niet als je een database classe gebruikt en je netjes SQL gebruikt volgens de ANSI-standaard. Dan zul je hooguit hier en daar een database-functie even moeten aanpassen (namen willen nog wel eens verschillend zijn) en klaar ben je.

En mocht je honderden keren bv. mysql_query() in je code hebben staan, met een zoek-en-vervang heb je daar in enkele secondes pg_query() van gemaakt... Met een uurtje moet je dit wel kunnen omzetten naar pgSQL.
Als ik eens tijd heb, kan ik het overwegen. Maar zou je mij de PHP oplossing kunnen vertellen?
Pak die query van Jeroen:

SELECT 
  ID, 
  naam, 
  bestand, 
  bestandstype, 
  toegevoegd 
FROM 
  spellen 
WHERE 
  ID in(select id FROM 
                    spellen 
                  WHERE 
                   categorie = 'Avontuur' 
                  ORDER BY toegevoegd desc 
                  LIMIT 0, 10)
ORDER BY  naam

Trek hier de subquery uit:

select id FROM 
                    spellen 
                  WHERE 
                   categorie = 'Avontuur' 
                  ORDER BY toegevoegd desc 
                  LIMIT 0, 10

Voer deze query (!) uit en ga het resultaat fetchen. Van dit resultaat maak je een mooie string zoals bv. dit: 23, 248, 447, 834

Pak vervolgens de rest van de oorspronkelijke query:

SELECT 
  ID, 
  naam, 
  bestand, 
  bestandstype, 
  toegevoegd 
FROM 
  spellen 
WHERE 
  ID in()
ORDER BY  naam

En die string keurig in de IN().

Ga deze nieuwe query uitvoeren en klaar is kees!
Het kon inderdaad op die manier, maar ik het toch gekozen om het met query's te doen. Gelukt met deze query's:

<?php
$aantal = 20;

$query1 = "CREATE TEMPORARY TABLE temp AS SELECT ID, naam, bestand, bestandstype, toegevoegd FROM spellen WHERE categorie = '";
$query2 = "' ORDER BY toegevoegd desc LIMIT 0, ".$aantal;
$query3 = "DROP TEMPORARY TABLE temp";

$nieuwquery = mysql_query("SELECT ID, naam, bestand, bestandstype, toegevoegd FROM spellen ORDER BY toegevoegd DESC LIMIT 0, ".($aantal + 1));

$populairquery = mysql_query("SELECT ID, naam, bestand, bestandstype, toegevoegd FROM spellen ORDER BY rating DESC, aantal_stemmen DESC, bekeken DESC LIMIT 0, ".($aantal + 1));

mysql_query($query1."Avontuur".$query2);
$avontuurquery = mysql_query("SELECT * FROM temp ORDER BY naam");
mysql_query($query3);

mysql_query($query1."Behendigheid".$query2);
$behendigheidquery = mysql_query("SELECT * FROM temp ORDER BY naam");
mysql_query($query3);

mysql_query($query1."Denk".$query2);
$denkquery = mysql_query("SELECT * FROM temp ORDER BY naam");
mysql_query($query3);

mysql_query($query1."Fun".$query2);
$funquery = mysql_query("SELECT * FROM temp ORDER BY naam");
mysql_query($query3);

mysql_query($query1."Multiplayer".$query2);
$multiplayerquery = mysql_query("SELECT * FROM temp ORDER BY naam");
mysql_query($query3);

mysql_query($query1."Race".$query2);
$racequery = mysql_query("SELECT * FROM temp ORDER BY naam");
mysql_query($query3);

mysql_query($query1."Sport".$query2);
$sportquery = mysql_query("SELECT * FROM temp ORDER BY naam");
mysql_query($query3);
?>

Misschien omslachtig, maar het werkt wel. :)

Bedankt voor de hulp iedereen!
Allemachtig! Dat is nogal een lap code/SQL voor iets simpels. 23 queries voor iets wat je met 1 query kunt doen...

Wat ben ik toch blij met pgSQL!
pgFrank schreef op 28.09.2007 17:14
Allemachtig! Dat is nogal een lap code/SQL voor iets simpels. 23 queries voor iets wat je met 1 query kunt doen...

Wat ben ik toch blij met pgSQL!

Ik ga denk ik wel een keer de overstap maken, maar ik moet toch een tijdelijke oplossing hebben. Als jij wat beters weet (zonder pgSQL), zeg het dan maar :)
Heeft niks te maken met pgSQL maar eerder met een brakke programmeur...

Reageren