Php-mysql ORDER BY vraagje
Ik wil op basis van een sort order sorteren maar helaas lukt dit niet.
Het is voor een menukaart waar je categorieen kan maken als voorgerechten, hoofdgerechten, nagerechten.
Bij het aanmaken van de categorieen kan je een sort order meegegeven als integer. Op basis van de sort order wil ik de menukaart weergeven.
Dit is de code:
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
40
41
42
43
44
45
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
40
41
42
43
44
45
<?php
$q = 'SELECT * FROM menu_item_to_bedrijf WHERE klant_id = "'.verkrijgIngelogdeKlantId().'" ORDER BY categorie_id, sort_order ASC ';
$result = $database->query($q);
if (mysqli_num_rows($result) == 0)
{
echo '<h3 class="text-center">U heeft nog geen menukaart ingevuld.</h3>';
}
$category = null;
while ($rows = mysqli_fetch_assoc($result))
{
if ($category != $rows['categorie_id'])
{
echo ' <table class="table menukaart">
<tbody>
';
$category = $rows['categorie_id'];
echo '<h3 style="background-color: #e84c3d; padding:5px; color:white;">'.verkrijgCategorieNaamById($rows['categorie_id']).'</h3>';
}
//echo $rows['naam'].' - '.$rows['prijs'].' - '.$rows['sort_order'].'<br/>';
echo ' <tr><td>'.$rows['naam'].'</td><td>€ '.$rows['prijs'].'</td></tr>';
}
echo ' </tbody>
</table>';
?>
$q = 'SELECT * FROM menu_item_to_bedrijf WHERE klant_id = "'.verkrijgIngelogdeKlantId().'" ORDER BY categorie_id, sort_order ASC ';
$result = $database->query($q);
if (mysqli_num_rows($result) == 0)
{
echo '<h3 class="text-center">U heeft nog geen menukaart ingevuld.</h3>';
}
$category = null;
while ($rows = mysqli_fetch_assoc($result))
{
if ($category != $rows['categorie_id'])
{
echo ' <table class="table menukaart">
<tbody>
';
$category = $rows['categorie_id'];
echo '<h3 style="background-color: #e84c3d; padding:5px; color:white;">'.verkrijgCategorieNaamById($rows['categorie_id']).'</h3>';
}
//echo $rows['naam'].' - '.$rows['prijs'].' - '.$rows['sort_order'].'<br/>';
echo ' <tr><td>'.$rows['naam'].'</td><td>€ '.$rows['prijs'].'</td></tr>';
}
echo ' </tbody>
</table>';
?>
Deze 2 tabellen bestaan in de database?
de hele query werkt niet meer? Hij sorteert op een onverwachte manier?
Zoals het nu staat haalt die alles perfect op per categorie, dus meerdere menu items in de juiste categorie alleen staat dan de volgorde niet goed, die moet volgens de sort_order gaan.
Group by gebruik je in combinatie met functies als SUM() of COUNT(). Jij misbruikt group-by om je dubbelen te verwijderen, maar dat doe je dus niet zoals het bedoeld is.
PS:
je script leest een stuk prettiger als je de query niet 150 tekens breed maakt, maar tussen door eens op enter zou drukken.
De query wordt dan vast overzichtelijker.
Toevoeging op 18/11/2015 16:32:42:
wat is leidend? de sort_order?
Dan doe je dus
ORDER BY sort_order ASC
als je eerst op categorie sorteert dan krijg je dus eerst een oplopende lijst met categorieën en daarbinnen gesorteerd op sort_order.
Je verhaal over de dubbelen volg ik niet zo.
als je bakkerij Jansen hebt, en bakkerij De Vries, dan lijkt het me niet meer dan logisch dat bij beide firma's "bakkerij" komt te staan
Ivo P op 18/11/2015 16:24:58:
group by zou een foutmelding moeten geven. Zeker in combinatie met select-*
Group by gebruik je in combinatie met functies als SUM() of COUNT(). Jij misbruikt group-by om je dubbelen te verwijderen, maar dat doe je dus niet zoals het bedoeld is.
PS:
je script leest een stuk prettiger als je de query niet 150 tekens breed maakt, maar tussen door eens op enter zou drukken.
De query wordt dan vast overzichtelijker.
Toevoeging op 18/11/2015 16:32:42:
wat is leidend? de sort_order?
Dan doe je dus
ORDER BY sort_order ASC
als je eerst op categorie sorteert dan krijg je dus eerst een oplopende lijst met categorieën en daarbinnen gesorteerd op sort_order.
Je verhaal over de dubbelen volg ik niet zo.
als je bakkerij Jansen hebt, en bakkerij De Vries, dan lijkt het me niet meer dan logisch dat bij beide firma's "bakkerij" komt te staan
Group by gebruik je in combinatie met functies als SUM() of COUNT(). Jij misbruikt group-by om je dubbelen te verwijderen, maar dat doe je dus niet zoals het bedoeld is.
PS:
je script leest een stuk prettiger als je de query niet 150 tekens breed maakt, maar tussen door eens op enter zou drukken.
De query wordt dan vast overzichtelijker.
Toevoeging op 18/11/2015 16:32:42:
wat is leidend? de sort_order?
Dan doe je dus
ORDER BY sort_order ASC
als je eerst op categorie sorteert dan krijg je dus eerst een oplopende lijst met categorieën en daarbinnen gesorteerd op sort_order.
Je verhaal over de dubbelen volg ik niet zo.
als je bakkerij Jansen hebt, en bakkerij De Vries, dan lijkt het me niet meer dan logisch dat bij beide firma's "bakkerij" komt te staan
Als ik enkel order by sort_order doe krijg ik dit:
Als afbeelding het niet doet: http://i65.tinypic.com/s1j08w.png
Gewijzigd op 18/11/2015 16:54:18 door Furio Scripting
En wat had je gewild?
Iets waarbij alle broodjes achterelkaar zouden staan?
Dan heb je inderdaad nodig ORDER BY categorie, sort_order.
Dan heb je het in 1 bij elkaarhorend blokje bijelkaar.Dan kun je nog kijken in welke volgorde je categorieën zouden moeten komen.
Maar wat is het probleem als je dat toevoegt?
Ivo P op 18/11/2015 21:21:32:
ja
En wat had je gewild?
Iets waarbij alle broodjes achterelkaar zouden staan?
Dan heb je inderdaad nodig ORDER BY categorie, sort_order.
Dan heb je het in 1 bij elkaarhorend blokje bijelkaar.Dan kun je nog kijken in welke volgorde je categorieën zouden moeten komen.
Maar wat is het probleem als je dat toevoegt?
En wat had je gewild?
Iets waarbij alle broodjes achterelkaar zouden staan?
Dan heb je inderdaad nodig ORDER BY categorie, sort_order.
Dan heb je het in 1 bij elkaarhorend blokje bijelkaar.Dan kun je nog kijken in welke volgorde je categorieën zouden moeten komen.
Maar wat is het probleem als je dat toevoegt?
Het probleem is dus als je order by categorie, sort_order doet dat de categorieen niet op volgorde staan van de sort_order. Ook moeten de items in de categorie op basis van hun sort_order op volgorde komen.
Wellicht dat mijn query en php opzet anders moet. Ik heb dus 2 tabellen.
1. Menu categorieen met daarin, naam, sort_order.
2. Menu items met daarin categorie_id, sort_order.
Wat ik wil is de juiste items in de categorie weergeven gesorteerd op de sort_order voor zowel de categorieen als de items in de categorie.
Je kan het vergelijken met menu items in menu categorieen bij bijv wordpress cms. Wel moeten de resultaten in een tabel komen voor overzichtelijke weergave.
Ger van Steenderen op 19/11/2015 08:03:02:
Als je de sort_order van de categorie wilt weten zal je die tabel via een join mee moeten nemen in de query:
Bedankt!
Ik heb die query voor mijn gevoel er nu goed in staan maar met welke php haal ik nu alle gegevens juist op? Ik heb weinig ervaring met joins. Hij haalt nu niets op helaas met de huidige code.
Al;s ik in SQl de code doe krijg ik volgens mij wel de juiste gegegevns plus volgordes met Ger ze query. Maar hoe ik dit in php per categorie kan uitlezen weet ik niet.
Zie afbeelding: http://oi66.tinypic.com/30911m0.jpg
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
40
41
42
43
44
45
46
47
48
49
50
51
52
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
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
//$q = 'SELECT * FROM menu_item_to_bedrijf WHERE klant_id = "'.$gegevens['klant_id'].'" ORDER BY categorie_id, sort_order ASC ';
$q = 'SELECT m.naam, m.prijs, m.sort_order, c.naam, c.sort_order
FROM menu_item_to_bedrijf m
JOIN menu_categorie_to_bedrijf c ON m.categorie_id = c.id
WHERE m.klant_id = '.$gegevens['klant_id'].'
ORDER BY c.sort_order, m.sort_order';
$result = $database->query($q);
if (mysqli_num_rows($result) == 0)
{
echo '<h3 class="text-center">Dit restaurant heeft nog geen menukaart ingevuld.</h3>';
}
$category = null;
while ($rows = mysqli_fetch_assoc($result))
{
if ($category != $rows['m.categorie_id'])
{
echo ' <table class="table menukaart">
<tbody>
';
$category = $rows['m.categorie_id'];
echo '<h3 style="background-color: #e84c3d; padding:5px; color:white;">'.verkrijgCategorieNaamById($rows['m.categorie_id']).'</h3>';
}
//echo $rows['naam'].' - '.$rows['prijs'].' - '.$rows['sort_order'].'<br/>';
echo ' <tr><td>'.$rows['m.naam'].'</td><td>€ '.$rows['m.prijs'].'</td></tr>';
}
echo ' </tbody>
</table>';
?>
//$q = 'SELECT * FROM menu_item_to_bedrijf WHERE klant_id = "'.$gegevens['klant_id'].'" ORDER BY categorie_id, sort_order ASC ';
$q = 'SELECT m.naam, m.prijs, m.sort_order, c.naam, c.sort_order
FROM menu_item_to_bedrijf m
JOIN menu_categorie_to_bedrijf c ON m.categorie_id = c.id
WHERE m.klant_id = '.$gegevens['klant_id'].'
ORDER BY c.sort_order, m.sort_order';
$result = $database->query($q);
if (mysqli_num_rows($result) == 0)
{
echo '<h3 class="text-center">Dit restaurant heeft nog geen menukaart ingevuld.</h3>';
}
$category = null;
while ($rows = mysqli_fetch_assoc($result))
{
if ($category != $rows['m.categorie_id'])
{
echo ' <table class="table menukaart">
<tbody>
';
$category = $rows['m.categorie_id'];
echo '<h3 style="background-color: #e84c3d; padding:5px; color:white;">'.verkrijgCategorieNaamById($rows['m.categorie_id']).'</h3>';
}
//echo $rows['naam'].' - '.$rows['prijs'].' - '.$rows['sort_order'].'<br/>';
echo ' <tr><td>'.$rows['m.naam'].'</td><td>€ '.$rows['m.prijs'].'</td></tr>';
}
echo ' </tbody>
</table>';
?>
Gewijzigd op 19/11/2015 14:56:19 door Furio Scripting
bedragen sla je het beste op als een DECIMAL()
bijvoorbeeld DECIMAL(8,2)
De bedragen komen dan met een . in de tabel te staan.
bijvoorbeeld 7.95
Maar daarmee is een bedrag ook echt een getal
Als je op varchars sorteert, dan is "30,99" kleiner dan "7.95"
Bovendien zou je de getallen als decimal ook kunnen gebruiken in een berekening.
Ivo P op 19/11/2015 15:27:13:
zie ik nu goed aan de uitlijning dat je de prijs als een varchar() hebt opgeslagen?
bedragen sla je het beste op als een DECIMAL()
bijvoorbeeld DECIMAL(8,2)
De bedragen komen dan met een . in de tabel te staan.
bijvoorbeeld 7.95
Maar daarmee is een bedrag ook echt een getal
Als je op varchars sorteert, dan is "30,99" kleiner dan "7.95"
Bovendien zou je de getallen als decimal ook kunnen gebruiken in een berekening.
bedragen sla je het beste op als een DECIMAL()
bijvoorbeeld DECIMAL(8,2)
De bedragen komen dan met een . in de tabel te staan.
bijvoorbeeld 7.95
Maar daarmee is een bedrag ook echt een getal
Als je op varchars sorteert, dan is "30,99" kleiner dan "7.95"
Bovendien zou je de getallen als decimal ook kunnen gebruiken in een berekening.
Bedankt voor de tip, ik doe dat enkel in dit geval zo omdat de gebruiker vaak met een comma de prijs invoert en om dan een str_replace te moeten doen om een . een , te maken is nu niet echt van belang omdat ik verder niets met deze prijs doe van het menu, enkel weergeven ervan.
Als iemand nog een oplossing weet voor mijn topic vraag heel graag.
In de query is m. een alias voor tabel naam, in het resultaat wordt alleen de kolomnaam meegegeven.
Ook ontbreekt de kolom categorie_id in de select van de query.
Vanwege het gebruik van alleen de kolomnaam moet je, als kolommen uit verschillende tabellen dezelfde naam hebben, één van die kolom anders benoemen anders wordt de waarde van de laatste kolom weergegeven.
onthoud dat even voor het moment dat je toch wat daarmee gaat doen, en er een klacht komt dat 2 soepjes van 7,95 samen opgeteld maar 14 euro kosten.
Ger van Steenderen op 20/11/2015 13:38:41:
Regel 32 van je code:
In de query is m. een alias voor tabel naam, in het resultaat wordt alleen de kolomnaam meegegeven.
Ook ontbreekt de kolom categorie_id in de select van de query.
Vanwege het gebruik van alleen de kolomnaam moet je, als kolommen uit verschillende tabellen dezelfde naam hebben, één van die kolom anders benoemen anders wordt de waarde van de laatste kolom weergegeven.
In de query is m. een alias voor tabel naam, in het resultaat wordt alleen de kolomnaam meegegeven.
Ook ontbreekt de kolom categorie_id in de select van de query.
Vanwege het gebruik van alleen de kolomnaam moet je, als kolommen uit verschillende tabellen dezelfde naam hebben, één van die kolom anders benoemen anders wordt de waarde van de laatste kolom weergegeven.
Het is gelukt hoor! Hartelijk dank voor de query en de uitleg, ook andere forum leden hartelijk dank voor jullie tijd en input.
Na het verschillend maken van de kolommen kon ik via de join functie correct sorteren.
Je had dat ook in de query zelf kunnen doen, je hoeft daarvoor niet de tabel aan te passen:
Sorry dat ik daarin niet helemaal duidelijk ben geweest.