Toon posts:

resultaat nog een keer DESC'en en dubbele adressen filteren.

Pagina: 1
Acties:

Verwijderd

Topicstarter
PHP:
1
SELECT COUNT(*) AS aantal, FROM_UNIXTIME( timestamp, '%d%m%y' ) AS time FROM bestelling_factuuradres GROUP BY time ORDER BY timestamp DESC LIMIT 30


Ik heb 2 problemen met deze query:

1. momenteelt doet hij een desc op 300+ rows dan pakt hij de eerste 30, dit is goed, alleen die 30 rows wil ik dan nog een keer omdraaien! Hoe die je dat in een query (indien moeglijk) anders PHP.

2. van alles 300+ rows waar hij aantal orders per dag gaat berekenen zitten dubbele adressen (dubbele orders) deze mag hij maar één keer tellen, hoe verwerk je dat in je query. ik heb al aardig zitten te zoeken maar deze 2 vragen zijn voor mij momenteel nog onbeantwoord.

Ik hoop dat iemand mij even kan helpen.

Verwijderd

1.) Ik zou zeggen, verander DESC in ASC :? kwatsch

2.) Zoek eens op DISTINCT

(red. dit is echt wel te zoeken in de tutorial)

[ Voor 6% gewijzigd door Verwijderd op 31-10-2004 17:33 ]


Verwijderd

Topicstarter
probleem is dus als ik ASC gebruik dat hij eerst die 300+ omdraait en dus niet de 30 rows waar het om gaat.

Verwijderd

Als je die resultaten in een array zet en dan de array sorteert dmv bijvoorbeeld sort, rsort, asort, arsort of ksort moet het lukken.

[ Voor 3% gewijzigd door Verwijderd op 31-10-2004 17:36 ]


Verwijderd

Sidney,

dat is wel een überranzige methode die je enkel en alleen moet gebruiken wanneer de SQ language de mogelijkheid niet heeft.

Verwijderd

Verwijderd schreef op 31 oktober 2004 @ 17:37:
Sidney,

dat is wel een überranzige methode die je enkel en alleen moet gebruiken wanneer de SQ language de mogelijkheid niet heeft.
Ja I know ;), maar omdat ie na het binnenkrijgen van de resultaten nog een keer wil sorteren geef ik de php-methode..

  • Eärendil
  • Registratie: Februari 2002
  • Laatst online: 08:42
Verwijderd schreef op 31 oktober 2004 @ 17:30:
PHP:
1

1. momenteelt doet hij een desc op 300+ rows dan pakt hij de eerste 30, dit is goed, alleen die 30 rows wil ik dan nog een keer omdraaien! Hoe die je dat in een query (indien moeglijk) anders PHP.
Je zou subqueries kunnen gebruiken
SQL:
1
2
3
4
5
6
7
8
9
SELECT * 
FROM (
    SELECT COUNT(*) AS aantal, FROM_UNIXTIME( timestamp, '%d%m%y' ) AS time 
    FROM bestelling_factuuradres 
    GROUP BY time 
    ORDER BY timestamp DESC 
    LIMIT 30
)
ORDER BY timestamp ASC

[ Voor 13% gewijzigd door Eärendil op 31-10-2004 18:14 ]


Verwijderd

Topicstarter
eej Eärendil,

Ik heb je query even uit gevoert in mijn PHPmyadmin, maar hij werkt niet erg.
jammer :/

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
Als je het aantal weet kun je ook iets als
code:
1
LIMIT 270, 30
doen.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Verwijderd

Topicstarter
het aantal is helaas elke dag anders.

Verwijderd

Dan kom je volgens mij toch echt op de PHP-manier uit.. Ookal is die erg ranzig.

Of 2 query's, 1 snelle om het aantal te weten te komen, en dan nog een om 'echt' te selecten met een LIMIT.

Verwijderd

Topicstarter
okee, geen probleem, ik heb ze allemaal geprobeerd:
sort, rsort, asort, arsort en ksort maar het draait mijn array niet om, het sorteerd hem alleen. weet iemand dus hoe ik een soort van DESC doe op mijn Array?

momenteel heb ik dit:

PHP:
1
2
3
4
5
6
7
$verkleining_grafiek = $max / 150;
usort($arr);
    for ($i = 0; $i < count($arr); $i++) {

        $grafiek = $arr[$i] / $verkleining_grafiek;
        echo "[img]../images/grafiek.gif[/img]";
    }

[ Voor 41% gewijzigd door Verwijderd op 31-10-2004 19:25 ]


Verwijderd

Topicstarter
maar usort($arr); werkt dus niet.

Verwijderd

je zegt dat het gesorteerd wordt ipv omgedraaid, maar als het gesorteerd is en je draait 'm om, dan is het toch andersom gesorteerd? Let dus ook op t verschil tussen bijvoorbeeld sort en rsort..

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 31 oktober 2004 @ 18:34:
het aantal is helaas elke dag anders.
Dat aantal zou je anders wel via een aparte query kunnen ophalen om ermee te werken lijkt me.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Eärendil
  • Registratie: Februari 2002
  • Laatst online: 08:42
Verwijderd schreef op 31 oktober 2004 @ 19:25:
maar usort($arr); werkt dus niet.
Anders lees je de documentatie van usort even door?
Daarin staat duidelijk dat usort twee argumenten nodig heeft, de tweede is de naam van een callback functie.

  • pjotrk
  • Registratie: Mei 2004
  • Laatst online: 15-07-2025
Vanaf mysql versie 4.1 zou de manier van Eärendil gewoon moeten werken, alleen moet je dan geloof ik nog wel een alias aan het subselect resultaat geven.
SQL:
1
2
3
4
5
6
7
8
9
SELECT *
FROM (
  SELECT COUNT(*) AS aantal, FROM_UNIXTIME( timestamp, '%d%m%y' ) AS time
  FROM bestelling_factuuradres
  GROUP BY time
  ORDER BY timestamp DESC
  LIMIT 30
) AS subquery
ORDER BY timestamp ASC


Of anders als je een versie van mysql hebt ouder dan 4.1 zoals grijze vos zei en met een extra query om het aantal records op te halen:
SQL:
1
2
3
4
5
6
7
8
9
SELECT COUNT(*) AS aantal
FROM bestelling_factuuradres
GROUP BY FROM_UNIXTIME( timestamp, '%d%m%y' )
// stop resultaat in php variable $aantal

SELECT COUNT(*) AS aantal, FROM_UNIXTIME( timestamp, '%d%m%y' ) AS time
FROM bestelling_factuuradres
ORDER BY timestamp ASC
LIMIT $aantal - 30, 30;


Of je zou als je een versie van mysql hebt ouder dan 4.1 een tijdelijke tabel kunnen gebruiken, wat als voordeel heeft dat je het aantal records niet op hoeft te halen in php.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$sql = "CREATE TEMPORARY TABLE tmp
          SELECT COUNT(*) AS aantal, FROM_UNIXTIME( timestamp, '%d%m%y' ) AS time
          FROM bestelling_factuuradres
          GROUP BY time
          ORDER BY timestamp DESC
          LIMIT 30";
mysql_unbuffered_query($sql);

$sql = "SELECT *
        FROM tmp
        ORDER BY timestamp ASC";
$result = mysql_query($sql);

$sql = "DROP TABLE tmp;";
mysql_query($sql);
(allemaal niet getest)

Voor het omdraaien van arrays werkt array_reverse() het makkelijkst of je kan de items al gelijk met array_unshift() in de array stoppen (maar dat is wel trager, vooral als je ooit meer dan 30 items in een array wilt stoppen), maar ik zou voor een oplossing in sql gaan hierbij.

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 07-04 13:41
http://eprogrammeur.nl/topic/36338/ helpt niet, hoewel je daar niet helemaal dezelfde vraag stelt :{

Verwijderd

Topicstarter
sorry hoor, ik zit nu al een tijdje te kloten maar ik krijg mijn array niet andersom hoe gek ook.

PHP:
1
2
3
4
5
6
7
$verkleining_grafiek = $max / 150; 
arsort($arr); 
    for ($i = 0; $i < count($arr); $i++) { 

        $grafiek = $arr[$i] / $verkleining_grafiek; 
        echo "[img]../images/grafiek.gif[/img]"; 
    }


is er niet gewoon een functie die mijn array omdraait
moet toch bestaan, het lijkt me heel izzi maar ik kom er dus ff ner uit. wie helpt mij.

arsort($arr); doet in iedergeval niet wat ik wil.

  • pjotrk
  • Registratie: Mei 2004
  • Laatst online: 15-07-2025
http://www.php.net/manual/en/function.array-reverse.php :?
PHP:
1
2
3
4
// zo
$arr = array_reverse ($arr);
// of als je je keys wilt behouden (naar de for lus kijkende waarschijnlijk niet) zo
$arr = array_reverse ($arr, true);

of je for lus aanpassen naar:
PHP:
1
2
3
4
5
$i =  count($arr);
while ( $i-- > 0 ) { 
    $grafiek = $arr[$i] / $verkleining_grafiek; 
    echo "[img]../images/grafiek.gif[/img]"; 
}

  • GlowMouse
  • Registratie: November 2002
  • Niet online
pjotrk komt met een prachtig idee, de for-lus aanpassen. Hoef je eigenlijk totaal niet meer met een array te werken.

PHP:
1
2
3
4
5
6
$result=mysql_query("SELECT COUNT(*) AS aantal, FROM_UNIXTIME( timestamp, '%d%m%y' ) AS time FROM bestelling_factuuradres GROUP BY time ORDER BY timestamp DESC LIMIT 30");
$num=mysql_num_rows($result);
for($i=$num-1; $i>=0; $i--) {
  $grafiek=mysql_result($result,$i,"aantal");
  echo "[img]../images/grafiek.gif[/img]"; 
}


Je draait de volgorde dan niet om, maar loopt ze van achter naar voren door.

[ Voor 9% gewijzigd door GlowMouse op 31-10-2004 22:30 . Reden: php ipv code tags ]


  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 07-04 13:41
Verwijderd schreef op 31 oktober 2004 @ 22:04:
sorry hoor, ik zit nu al een tijdje te kloten maar ik krijg mijn array niet andersom hoe gek ook.

PHP:
1
2
3
4
5
6
7
$verkleining_grafiek = $max / 150; 
arsort($arr); 
    for ($i = 0; $i < count($arr); $i++) { 

        $grafiek = $arr[$i] / $verkleining_grafiek; 
        echo "[img]../images/grafiek.gif[/img]"; 
    }


is er niet gewoon een functie die mijn array omdraait
moet toch bestaan, het lijkt me heel izzi maar ik kom er dus ff ner uit. wie helpt mij.

arsort($arr); doet in iedergeval niet wat ik wil.
PHP:
1
2
3
4
5
6
7
$verkleining_grafiek = $max / 150;
arsort ($arr);
foreach ($arr as $key =>  $value)
{
        $grafiek = $value / $verkleining_grafiek; 
        echo "[img]../images/grafiek.gif[/img]";
}


Was je precies op uitgekomen, als je een beetje lezen kon ;)
Pagina: 1