[PHP]Na Query multi dimensionale array sorteren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • degroot
  • Registratie: December 2003
  • Niet online
Hallo,

Ik ben bezig met een soort statistieken overzicht.
Daarin staat een tabel , gevuld met MySQL gegevens.
De tabel bestaat uit 5 Kolommen
De eerste 4 kolommen zijn gegevens uit de database.
Kolom nummer 5 is een kolom die de waarde van de overige kollomen bij elkaar optelt.

Nu kan ik dus die eerste 4 kolommen mooi sorteren doormiddel van een SQL query.
Alleen gaat dat natuurlijk niet met kolom 5.

Ik zal jullie even de code laten zien , ter verduidelijking , hoe ik de gegevens uit de MySQL database krijg.
[code=php]<?
$buscaCompany = new buscaCompany();

if (isset($_POST['orderBy'])) $orderBy = $_POST['orderBy']; else $orderBy = 1;
if (isset($_POST['orderType'])) $orderType = $_POST['orderType']; else $orderType = "ASC";

if ($orderBy!=6) {
$arStatistics = $buscaCompany->getAllStatistics($orderBy, $orderType);
} else {
$arStatistics = $buscaCompany->getAllStatistics(1, "ASC");

asort($arStatistics);
echo $arStatistics;

}

if($arStatistics)
$count=0;
foreach($arStatistics as $stat) {
$company = $buscaCompany->getAllById($stat['company_id']);
$stat['company_name'] = $company['name'];
$arStatistics[$count] = $stat;
$count++;
}
?>
<html>
<head>
<title>EnCore - Busca - Statistics</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="./css/style.css" rel="stylesheet" type="text/css">
<script language="javascript">
var allSelected = false;

function orderBy(order_by) {
if(document.statisticsForm.orderBy.value == order_by && document.statisticsForm.orderType.value == "DESC") document.statisticsForm.orderType.value = "ASC";
else if(document.statisticsForm.orderBy.value == order_by && document.statisticsForm.orderType.value == "ASC") document.statisticsForm.orderType.value = "DESC";
document.statisticsForm.orderBy.value = order_by;
document.statisticsForm.submit();
}
</script>
</head>
<body>
<table width="100%">

<!-- Begin Form -->
<form name="statisticsForm" action="<?=$PHP_SELF;?>" method="POST">

<input type="hidden" name="orderBy" value="<?=$orderBy?>">
<input type="hidden" name="orderType" value="<?=$orderType?>">

<tr bgcolor="#EEEEEE">
<td colspan="7">
<table height="25" width="100%">
<td>BUSCA > <a href="statistics.php">Statistics</a></td>
<!--<td align="right"><input type="button" value="Update Activities" onclick="activitiesUpdate();"></td>-->



<table width="100%" border="1" style="border-collapse:collapse">

<?
echo "<tr bgcolor='#DDDDDD'>\n";
echo "<td align=center><b><a href='javascript:orderBy(1);'>id</a></b></td>\n";
echo "<td align=center><b><a href='javascript:orderBy(3);'>company name</a></b></td>\n";
echo "<td align=center><b><a href='javascript:orderBy(2);'>clicks</a></b></td>\n";
echo "<td align=center><b><a href='javascript:orderBy(4);'>List views</a></b></td>\n";
echo "<td align=center><b><a href='javascript:orderBy(5);'>Form views</a></b></td>\n";
echo "<td align=center><b><a href='javascript:orderBy(6);'>Total</a></b></td>\n";
echo "</tr>\n";

$count = 0;
if ($arStatistics)
foreach ($arStatistics as $stat) {
if($bgcolor == "#FFFFFF"){
$bgcolor = "#F8F6F8";
}else{
$bgcolor = "#FFFFFF";
}
echo "<tr height=21 bgcolor='$bgcolor' onMouseover='this.style.backgroundColor=\"#FFFFD7\";' onMouseout='this.style.backgroundColor=\"$bgcolor\";'>\n";
echo '<td align=center width=5%>'.$stat['company_id'].'</td>';
echo '<td>'.$stat['company_name'].'</td>';
echo '<td align=center width=10%>'.$stat['clicks'].'</td>';
echo '<td align=center width=10%>'.$stat['list_clicks'].'</td>';
echo '<td align=center width=10%>'.$stat['form_clicks'].'</td>';
echo '<td align=center width=10%>'.$total.'</td>';
echo '</tr>';
$count++;

} else {
echo("<tr><td class=red>SORRY NO STATISTICS FOUND</td></tr>");
}
?>
[/code=php]


De query staat in een andere klasse.
Die is denk ik ook verder niet voor belang van deze vraag.

Ik wil ook graag die 5e kolom kunnen sorteren.
Dus moet ik de gegevens na de query , opnieuw opvangen en filtereren.
De gegevens die ik dus opvang , moet ik in een multi-dimensionale array zetten(zo redeneer ik goed toch?)
Dat stukje ziet er zo uit
[CODE=php]
if ($orderBy!=6) {
$arStatistics = $buscaCompany->getAllStatistics($orderBy, $orderType);
} else {
$arStatistics = $buscaCompany->getAllStatistics(1, "ASC");

asort($arStatistics);
echo $arStatistics;

}[/code=php]

Het gaat dus om het stukje vanaf de ELSE statement
Ik sorteer dus gewoon ook voor de laatste kolom in de query(alleen dan op de eerste kolom , puur om gegevens op te vangen)
Daarna wil ik de array graag even echo-en , om alleen al even mijn output te zien.
Maar daar gaat het dus al mis.

Terwijl de query hetzelfde is als bij de IF statement alleen dan met vaste waarde.
En ik krijg geen resultaten terug.

Weet iemand waar mijn denkwijze fout zit?
Of kan iemand mij weer even de goede kant opsturen?

www.degroot-it.nl


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Waarom zou je die extra kolom niet ook uit de database halen? Een som kun je in een query berekenen met SUM.

Je code voegt trouwens niet zoveel toe: niemand zal 200 regels code lezen om de nuttige informatie eruit te halen. Je kunt dus beter de noodzakelijke dingen laten zien, en daarbij [php]-tags gebruiken.

Acties:
  • 0 Henk 'm!

  • degroot
  • Registratie: December 2003
  • Niet online
GlowMouse schreef op donderdag 08 februari 2007 @ 13:01:
Waarom zou je die extra kolom niet ook uit de database halen? Een som kun je in een query berekenen met SUM.
Dat van die SUM weet ik wel.
Maar als ik een sum gemaakt heb in een query , dan is het toch niet mogelijk om dan op die SUM te filtereren , in dezelfde query?

Ik wil trouwens dat PHP de totale maakt(mag ook met query) , maar ik wil er geen aparte tabel voor in de database hebben.
Zodat php niet een extra tabel ervoor hoeft uit te lezen

PHP tags veranderd , zal code ook leesbaar maken

[ Voor 16% gewijzigd door degroot op 08-02-2007 13:09 ]

www.degroot-it.nl


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
degroot schreef op donderdag 08 februari 2007 @ 13:04:
[...]
Dat van die SUM weet ik wel.
Maar als ik een sum gemaakt heb in een query , dan is het toch niet mogelijk om dan op die SUM te filtereren , in dezelfde query?
Momenteel filter je toch ook niks? Sorteren kan gewoon, en mocht je condities op de som op willen leggen lukt dat met HAVING.

Acties:
  • 0 Henk 'm!

  • degroot
  • Registratie: December 2003
  • Niet online
Jawel , ik filter wel zeker.
Ik zal de query even posten.

Ik filter namelijk op de eerste kolom , puur om alleen de data uit de database te halen(query staat in een functie)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        function getAllStatistics($order_by=false, $order_type=false) {
            $select = "SELECT s.company_id, s.clicks, c.name, s.list_clicks, s.form_clicks
                       FROM busca_statistics s
                       LEFT JOIN busca_companies c
                       ON s.company_id = c.company_id";
            if($order_by) $order = " ORDER BY $order_by $order_type";
            else $order = " ORDER BY company_id ASC";
            $sql = $select.$order;  
                 
            $res = mysql_query($sql) or die("Query error: " .mysql_error());
            if(isset($res))
                while($row = mysql_fetch_assoc($res)) {
                    $arRows[] = $row;
                }
            return $arRows;
        }


Daarom wil ik graag het resultaat van deze query opvangen , in een multi array stoppen , die weer sorteren , en die output in de tabel zien te krijgen

www.degroot-it.nl


Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 21:03
Even iets tussendoor. Je kan ook gewoon:
PHP:
1
2
  if($order_by) $select .= " ORDER BY $order_by $order_type";
  else $select .= " ORDER BY company_id ASC";

gebruiken :). Dan hoef je geen extra $variabele te gebruiker en geen strings aan elkaar te plakken ;)

Acties:
  • 0 Henk 'm!

  • JWolters
  • Registratie: Maart 2001
  • Laatst online: 13:26

JWolters

Killing Me Killing You

je kunt ook "ORDER BY 1"of "ORDER BY 5" doen om te sorteren op een kolom (en dat dus ook op een SUM)

ik zie niet waar je een filter uitvoert (ik zie dus geen WHERE of HAVING in de query staan)

[ Voor 46% gewijzigd door JWolters op 08-02-2007 13:35 ]

Time is my only fear, an enemy of Sand


Acties:
  • 0 Henk 'm!

  • degroot
  • Registratie: December 2003
  • Niet online
Ik ga dan voor die sum query een nieuwe functie aanmaken.
Die komt er dan zo uit te zien(als ik de sum functie , en jullie gedachten gang een beetje begrijp)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
            function getAllStatisticsSum() {
            $sql = "SELECT s.company_id, s.clicks, c.name, s.list_clicks, s.form_clicks order by SUM(s.clicks,s.list_clicks, s.form_clicks)
                       FROM busca_statistics s
                       LEFT JOIN busca_companies c
                       ON s.company_id = c.company_id";     
            $res = mysql_query($sql) or die("Query error: " .mysql_error());
            if(isset($res))
                while($row = mysql_fetch_assoc($res)) {
                    $arRows[] = $row;
                }
            return $arRows;
        }
JWolters schreef op donderdag 08 februari 2007 @ 13:27:
ik zie niet waar je een filter uitvoert (ik zie dus geen WHERE of HAVING in de query staan)
Nee klopt , ik moet inderdaad alle gegevens uit de tabel hebben , wat dus zou betekenen dat dit heel gemakkelijk in de query te doen is , ipv een moeilijke mulit dimensionale array te schrijven?

EDIT:
Na wat meer zoekwerk , zie ik bijna alleen maar voorbeelden van SUM op 1 enkele kolom.
Wil dat dus zeggen dat je alleen een SUM op een kolom kan doen?
Want ik wil namelijk het totaal per rij , dus van links naar rechts , en niet van onder naar boven

[ Voor 29% gewijzigd door degroot op 08-02-2007 14:49 ]

www.degroot-it.nl


Acties:
  • 0 Henk 'm!

  • JWolters
  • Registratie: Maart 2001
  • Laatst online: 13:26

JWolters

Killing Me Killing You

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
  s.company_id, 
  s.clicks, 
  c.name, 
  s.list_clicks, 
  s.form_clicks, 
  SUM(s.clicks+s.list_clicks+s.form_clicks) 
FROM 
  busca_statistics s 
LEFT JOIN 
  busca_companies c 
ON 
  s.company_id = c.company_id
GROUP BY
  ??


ik weet niet waarover je de sum wilt berekenen, maar je kunt nu "ORDER BY 6" doen om te sorteren op de SUM-kolom

Time is my only fear, an enemy of Sand


Acties:
  • 0 Henk 'm!

  • degroot
  • Registratie: December 2003
  • Niet online
JWolters schreef op donderdag 08 februari 2007 @ 14:53:

ik weet niet waarover je de sum wilt berekenen, maar je kunt nu "ORDER BY 6" doen om te sorteren op de SUM-kolom
Wij zijn bezig met SEO.
Omdat we graag willen weten hoevaak een pagina bezocht is hebben we 3 tabellen.
1tje voor als het zoek resultaat aangeklikt word
1tje voor iedere entry die in de lijst met resultaten voorkomt.
en 1tje voor de entry's die weergegeven worden doormiddel van een gesubmit form(deze kan de searchbots namelijk niet zelf doen)

Dus wil ik van website A weten het totaal van de aantal kliks
Van website B het totaal van de aantal kliks
Etc etc etc

Dat is dus mijn bedoeling met deze database ;)

www.degroot-it.nl


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Voor de som per rij heb je inderdaad geen SUM nodig. Je kunt dan gewoon SELECT col1, col2, col1+col2 FROM table ORDER BY col1+col2 doen.

Acties:
  • 0 Henk 'm!

  • degroot
  • Registratie: December 2003
  • Niet online
GlowMouse schreef op donderdag 08 februari 2007 @ 15:00:
Voor de som per rij heb je inderdaad geen SUM nodig. Je kunt dan gewoon SELECT col1, col2, col1+col2 FROM table ORDER BY col1+col2 doen.
He!
Bedankt man , dat werkt dus schijnbaar wel gewoon :d en veel simpeler.
Ik zat allemaal in de moeilijke hoek te zoeken , maar krijg na een tijdje al argwaan toen ik alleen maar voorbeelden van dit tegenkwam waarbij alleen de kolom totalen werden opgetelt.

Voortaan mijn hersenen toch maar op wat minder proffesioneel denken zetten _/-\o_

www.degroot-it.nl


Acties:
  • 0 Henk 'm!

  • JWolters
  • Registratie: Maart 2001
  • Laatst online: 13:26

JWolters

Killing Me Killing You

GlowMouse schreef op donderdag 08 februari 2007 @ 15:00:
Voor de som per rij heb je inderdaad geen SUM nodig. Je kunt dan gewoon SELECT col1, col2, col1+col2 FROM table ORDER BY col1+col2 doen.
of "SELECT col1, col2, col1+col2 FROM table ORDER BY 3" :)

Time is my only fear, an enemy of Sand


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
JWolters schreef op donderdag 08 februari 2007 @ 15:20:
[...]
of "SELECT col1, col2, col1+col2 FROM table ORDER BY 3" :)
Het nadeel van zulke constructies is dat je heel goed je queries door moet lezen wanneer je ooit een extra kolom op wilt vragen. Dit kun je wel omzeilen door ze steeds aan het einde toe te voegen, maar iemand die na jou een wijziging aan de code maakt hoeft dat niet te weten.

Acties:
  • 0 Henk 'm!

  • JWolters
  • Registratie: Maart 2001
  • Laatst online: 13:26

JWolters

Killing Me Killing You

In dit geval was het uiteraard dan ook beter geweest om "SELECT col1, col2, col1+col2 AS col3 FROM table ORDER BY col3" te doen. Maar in het geval van "SELECT col1, SUM(col2) AS col3 FROM table GROUP BY col1 ORDER BY 2" kun je geen "ORDER BY col3" doen (als ik me niet vergis)

Time is my only fear, an enemy of Sand

Pagina: 1