[PHP] Evenementen in database oplopend sorteren met eerstvolgende datum vanboven

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Xaboteur X

Xaboteur X

09/03/2012 14:58:24
Quote Anchor link
Hallo allemaal,

Ik heb met php en mysql een lijst met evenementen gegenereerd, en wil deze graag oplopend sorteren met eerstvolgende datum bovenaan.
MAAR, ik wil ook graag de voorbije evenementen onderaan de lijst zetten.
Is dit mogelijk met één of twee queries en misschien in één while loop?


Lijst voorbeeld:

- vandaag
- morgen
- overmorgen
- daarna
- daarna
- gisteren
- eergisteren
- daarvoor
- daarvoor


Bedankt alvast.
 
PHP hulp

PHP hulp

25/11/2024 08:03:07
 
Albert de Wit

Albert de Wit

09/03/2012 15:24:31
Quote Anchor link
Kun je het niet beter zo doen?

Voor voor eergisteren
Voor eergisteren
Eergisteren
Gisteren
Vandaag
Morgen
Overmorgen
Na overmorgen
Na na overmorgen

Toevoeging op 09/03/2012 15:32:59:

Ik ken je query niet maar ik neem aan dat hij er zo uitziet.
id (ai/primary) date (unix timestamp), event.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$query
= mysql_query("SELECT date, event FROM events");

$huidige_timestamp = date();

while ($rij = mysql_fetch_row($query))
{

if ($row[0]<=$huidige_timestamp)
{

echo "<s>".$rij[0].$rij[1]."</s>";
}

elseif ($row[0]>=$huidige_timestamp)
{

echo "<b>".$row[0].$row[1]."</b>";
}
}

?>
Gewijzigd op 09/03/2012 15:24:52 door Albert de Wit
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/03/2012 16:10:13
Quote Anchor link
dit kan in een query dmv union:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
SELECT field1, field2, evdate
FROM events
WHERE evdate >= DATE(NOW())
ORDER BY evdate
UNION
SELECT field1, field2, evdate
FROM events
WHERE evdate < DATE(NOW())
ORDER BY evdate DESC
Gewijzigd op 09/03/2012 16:12:34 door Ger van Steenderen
 
Xaboteur X

Xaboteur X

09/03/2012 19:56:46
Quote Anchor link
@Albert: Vandaag zou sowieso vanboven moeten. De lijst zal zich opvullen, en als dan een hoop events van het verleden vanboven staan is niet zo praktisch.

@Ger: Die query zorgt bij mij voor een error: Incorrect usage of UNION and ORDER BY.

EDIT: Als ik de eerste ORDER BY weglaat wordt de query uitgevoerd, maar dan is dus alles gesorteerd op de manier van de laatste ORDER BY.
Gewijzigd op 09/03/2012 20:01:16 door Xaboteur X
 
Aad B

Aad B

09/03/2012 20:58:05
Quote Anchor link
@Albert de Wit: Vreemde oplossing....
@Ger UNION kan inderdaad niet met 2x ORDER BY, oplossen met inline views
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT a.field1, a.field2, a.evdate
union
SELECT b.field1, b.field2, b.evdate
FROM (
SELECT field1, field2, evdate
FROM events
WHERE evdate >= DATE(NOW())
ORDER BY evdate ) a,
     (
SELECT field1, field2, evdate
FROM events
WHERE evdate < DATE(NOW())
ORDER BY evdate DESC ) b
 
Xaboteur X

Xaboteur X

10/03/2012 19:26:59
Quote Anchor link
Hey Aad B,

Bedankt voor je query tip!
Alleen heb ik met wat zoekwerk gevonden dat er voor a en b, AS moet staan?
Hoewel ik dan nog steeds een query error krijg met: "Unknown table 'a' in field list"

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT a.field1, a.field2, a.evdate
union
SELECT b.field1, b.field2, b.evdate
FROM (
SELECT field1, field2, evdate
FROM events
WHERE evdate >= DATE(NOW())
ORDER BY evdate ) AS a,
     (
SELECT field1, field2, evdate
FROM events
WHERE evdate < DATE(NOW())
ORDER BY evdate DESC ) AS b
[/CODE]
 
Jaron T

Jaron T

10/03/2012 22:07:48
Quote Anchor link
AS is optioneel om een result/column een alias geven. In dit gevalt zou je achter je FROM [tabelnaam] de alias kunnen zetten en gebruiken in de SELECT.
 
Xaboteur X

Xaboteur X

11/03/2012 13:13:25
Quote Anchor link
Als ik de aliassen verplaats naar achter FROM events ..., krijg ik nog steeds een error.
Ditmaal deze: "Every derived table must have its own alias"

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT a.field1, a.field2, a.evdate
union
SELECT b.field1, b.field2, b.evdate
FROM (
SELECT field1, field2, evdate
FROM events AS a
WHERE evdate >= DATE(NOW())
ORDER BY evdate ),
     (
SELECT field1, field2, evdate
FROM events AS b
WHERE evdate < DATE(NOW())
ORDER BY evdate DESC )
Gewijzigd op 11/03/2012 13:14:10 door Xaboteur X
 
Aad B

Aad B

13/03/2012 21:03:35
Quote Anchor link
Je hebt nu een alias gehangen aan de table en niet aan het resultaat, de derived table. Onderstaand aangepast:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT a.field1, a.field2, a.evdate
union
SELECT b.field1, b.field2, b.evdate
FROM (
SELECT field1, field2, evdate
FROM events AS a
WHERE evdate >= DATE(NOW())
ORDER BY evdate ) a,
     (
SELECT field1, field2, evdate
FROM events as b
WHERE evdate < DATE(NOW())
ORDER BY evdate DESC ) b

Volgens mij zijn de AS a en AS b niet nodig en voor de duidelijkheid, er is geen relatie tussen a als derived table en AS a als alias.
Gewijzigd op 13/03/2012 21:10:28 door Aad B
 
Xaboteur X

Xaboteur X

13/03/2012 21:09:33
Quote Anchor link
Hey Aad, dat had ik dus eerst, maar dat gaf ook een error. Zie post ervoor.
 
Aad B

Aad B

13/03/2012 21:12:02
Quote Anchor link
Zojuist nog aanpassing gemaakt en opmerking toegevoegd. Ik zal even een testje bouwen. Kom hier nog op terug.
 
Xaboteur X

Xaboteur X

13/03/2012 21:15:46
Quote Anchor link
Ja, ik krijg nog steeds dezelfde error: Unknown table 'a' in field list

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT a.field1, a.field2, a.evdate
union
SELECT b.field1, b.field2, b.evdate
FROM (
SELECT field1, field2, evdate
FROM events
WHERE evdate >= DATE(NOW())
ORDER BY evdate ) a,
     (
SELECT field1, field2, evdate
FROM events
WHERE evdate < DATE(NOW())
ORDER BY evdate DESC ) b
 
Aad B

Aad B

13/03/2012 21:29:46
Quote Anchor link
Knippen en plakken fout zie ik nu, eerst een voorbeeld zoals het wel werkt en dan jouw query aangepast:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
mysql> select a.id
       from (select id from klant_order where id =200) as a  
       union
       select b.id
       from (select id from klant_order where id =201) as b;
+-----+
| id  |
+-----+
| 200 |
| 201 |
+-----+
2 rows in set (0.00 sec)

de syntax volgorde is dus aangepast:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
SELECT a.field1, a.field2, a.evdate
FROM (SELECT field1, field2, evdate
        FROM events
       WHERE evdate >= DATE(NOW())
       ORDER BY evdate ) as a
UNION
SELECT b.field1, b.field2, b.evdate
FROM  (SELECT field1, field2, evdate
       FROM events
      WHERE evdate < DATE(NOW())
      ORDER BY evdate DESC ) as b
Gewijzigd op 13/03/2012 21:31:00 door Aad B
 
Xaboteur X

Xaboteur X

13/03/2012 21:36:40
Quote Anchor link
Super, Aad! Query ziet er ook logischer uit zo, nu ik hem zie... :)
Bedankt!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.