Spellen limiteren
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:
Code (php)
1
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<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&actie=speel&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>
<!-- Avontuur -->
<ul>
<?php
while ($avontuur = mysql_fetch_array($avontuurquery, MYSQL_ASSOC)) {
list(, $klein) = explode(",", $avontuur['bestandstype']);
?>
<li><a href="index.php?pagina=spellen&actie=speel&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?
Gewijzigd op 01/01/1970 01:00:00 door Willem-Jan
SELECT ID, naam, bestand, bestandstype, toegevoegd FROM spellen WHERE categorie = 'Avontuur' ORDER BY toegevoegd DESC, naam ASC LIMIT 0, 10
Jonathan schreef op 27.09.2007 19:49:
SELECT ID, naam, bestand, bestandstype, toegevoegd FROM spellen WHERE categorie = 'Avontuur' ORDER BY toegevoegd DESC, naam ASC LIMIT 0, 10
Een tweede ORDER BY heeft pas zin als de eerste identiek is, dus als er meerdere dezelfde gegevens bij de eerste ORDER BY is, dan pas gaat hij de tweede ORDER BY gebruiken.
Iemand anders nog een oplossing?
Je moet gewoon een lege array maken, dan door die while lopen en d.m.v. die while de array vullen. Dan kan je de array sorteren en met foreach op het scherm toveren.
Jonathan schreef op 27.09.2007 19:53:
Nu je 't zegt.
Je moet gewoon een lege array maken, dan door die while lopen en d.m.v. die while de array vullen. Dan kan je de array sorteren en met foreach op het scherm toveren.
Je moet gewoon een lege array maken, dan door die while lopen en d.m.v. die while de array vullen. Dan kan je de array sorteren en met foreach op het scherm toveren.
Kan wel, maar is er geen makkelijkere oplossing? Dan moet ik die hele while loop hierboven, en alles weer veranderen.
Kan hiet niet gewoon met een andere SQL query, of een functie in PHP?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
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
even uit mijn hoofd en niet getest. Kan zijn dat je nog met alias naam moet werken
Gewijzigd op 01/01/1970 01:00:00 door Jeroen Jansen
Jeroen schreef op 27.09.2007 20:33:
Misschien werken met een sub-query.
even uit mijn hoofd en niet getest. Kan zijn dat je nog met alias naam moet werken
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
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
even uit mijn hoofd en niet getest. Kan zijn dat je nog met alias naam moet werken
Ik ben er bijna, alleen volgens MySQL mag er geen LIMIT in een IN(). Is er nog een mogelijkheid dat het dan wel werkt, zoals ik het wil?
Mag er een LIMIT in een subquery? (de IN() waar jij het over hebt) Of kun je geen subquery uitvoeren? Welke versie van MySQL gebruik je?
Ik heb de nieuwste versie van MySQL. Er mag dus geen LIMIT in de subquery.
Weet jij een oplossing?
Je hebt gelijk, dat werkt weer eens niet. Ik heb nieuws voor je, in pgSQL werkt dit dus wél. (en ja, ik heb met MySQL 5.0 en pgSQL 8.2 getest)
Wanneer je écht MySQL wilt gebruiken, ben ik bang dat je met 2 queries moet gaan werken. Het is een lapmiddel, maar dat is niet anders.
Al zou je ook met een stored procedure kunnen werken, maar ook daar zul je 2 queries in moeten zetten. Het enige verschil is dan dat je vanuit PHP slechts 1 query (de SP) hoeft aan te roepen.
Ik raad je aan om afscheid te nemen van MySQL, het blijft beperkingen houden.
pgFrank schreef op 27.09.2007 21:04:
@#$%^&*
Je hebt gelijk, dat werkt weer eens niet. Ik heb nieuws voor je, in pgSQL werkt dit dus wél. (en ja, ik heb met MySQL 5.0 en pgSQL 8.2 getest)
Wanneer je écht MySQL wilt gebruiken, ben ik bang dat je met 2 queries moet gaan werken. Het is een lapmiddel, maar dat is niet anders.
Al zou je ook met een stored procedure kunnen werken, maar ook daar zul je 2 queries in moeten zetten. Het enige verschil is dan dat je vanuit PHP slechts 1 query (de SP) hoeft aan te roepen.
Ik raad je aan om afscheid te nemen van MySQL, het blijft beperkingen houden.
Je hebt gelijk, dat werkt weer eens niet. Ik heb nieuws voor je, in pgSQL werkt dit dus wél. (en ja, ik heb met MySQL 5.0 en pgSQL 8.2 getest)
Wanneer je écht MySQL wilt gebruiken, ben ik bang dat je met 2 queries moet gaan werken. Het is een lapmiddel, maar dat is niet anders.
Al zou je ook met een stored procedure kunnen werken, maar ook daar zul je 2 queries in moeten zetten. Het enige verschil is dan dat je vanuit PHP slechts 1 query (de SP) hoeft aan te roepen.
Ik raad je aan om afscheid te nemen van MySQL, het blijft beperkingen houden.
En kan ik dit dan niet verder regelen met PHP, dus dat PHP de namen in alfabetische volgorde zet?
en als je de limit gewoon op het einde zet (buiten de sub-query) ?
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.
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.
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?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
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:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
select id FROM
spellen
WHERE
categorie = 'Avontuur'
ORDER BY toegevoegd desc
LIMIT 0, 10
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
SELECT
ID,
naam,
bestand,
bestandstype,
toegevoegd
FROM
spellen
WHERE
ID in()
ORDER BY naam
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!
Gewijzigd op 01/01/1970 01:00:00 door Frank -
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?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);
?>
$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!
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!
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...