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:
<?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>';
?>
Deze 2 kolommen staan in de tabel menu_item_to_bedrijf. Als ik niet categorie_id als eerste order by zet dan zet die de categorieën meerdere malen onder elkaar. Als ik group by categorie_id doe en order by sort_order staan de categorieen goed maar haalt die maar 1 menu item op van iedere categorie.
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 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 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
Als ik enkel order by sort_order doe krijg ik dit:
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.
Als je de sort_order van de categorie wilt weten zal je die tabel via een join mee moeten nemen in de query:
SELECT m.menu_naam, m.prijs, c.categorie_naam /* etc. */
FROM menu_item_to_bedrijf m
JOIN categorieen c ON m.categorie_id = c.categorie_id
WHERE m.klant_id = 1234
ORDER BY c.sort_order, m.sort_order
Als je de sort_order van de categorie wilt weten zal je die tabel via een join mee moeten nemen in de query:
SELECT m.menu_naam, m.prijs, c.categorie_naam /* etc. */
FROM menu_item_to_bedrijf m
JOIN categorieen c ON m.categorie_id = c.categorie_id
WHERE m.klant_id = 1234
ORDER BY c.sort_order, m.sort_order
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.