abonnement Unibet Coolblue
  FOK!-Schrikkelbaas woensdag 28 september 2005 @ 20:42:37 #2
1972 Swetsenegger
Egocentrische Narcist
pi_31009360
Ik heb een tabel catagorieen, waar op dit moment 17 verschillende in staan.
En ik heb een tabel met items, welke op die catagorieen ingedeeld zijn.

Tabel catagorie
1
2
3
4
5
6
|ID|Catagorie| 
+--+---------+ 
|1 |Eten     | 
|2 |Sport    | 
|3 |Studie   | 
|4 |etc, etc | 


Tabel Item
1
2
3
4
5
6
7
|ID|Catagorie|Item     |Naam  | 
+--+---------+---------+------+ 
|1 |Eten     |Montignac|Arie  | 
|2 |Sport    |Voetbal! |Tinus | 
|3 |Studie   |PHP      |Kees  | 
|4 |Eten     |Moermans |Bertus| 
|5 |etc      |etc      |etc   | 

Nu wil ik op de frontpage de laatste 3 records uit tabel item, per catagorie.

Het makkelijkst is zoiets als:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$query
="SELECT * FROM catagorie";
$result=mysql_query($query);
while(
$row=mysql_fetch_assoc($result)){

  echo
"<div>".$row[catagorie]."<br />";
  
$query_item="SELECT * FROM item WHERE catgorie='".$row['catgorie']."' LIMIT 3";
  
$result_item=mysql_query($query_item);
  while(
$record=mysql_fetch_assoc($result_item)){
    echo
$record[item]."<br />";
  }
  echo
"</div>";
}
?>


Maar dit betekent 18 queries per hit op de frontpage, en dat kan alleen maar meer worden als er meer catagorieen komen.

Iemand een handigere oplossing?
pi_31009476
Volgens mij kun je het in één query doen door een LEFT JOIN te doen op `Catagorie`.

categorie overigens?
  FOK!-Schrikkelbaas woensdag 28 september 2005 @ 20:48:33 #4
1972 Swetsenegger
Egocentrische Narcist
pi_31009561
quote:
Op woensdag 28 september 2005 20:46 schreef Nevermind het volgende:
Volgens mij kun je het in één query doen door een LEFT JOIN te doen op `Catagorie`.
Volgens mij haal ik dan gewoon de laatste 3 records van 1 categorie uit de tabel. EN ik moet 17 maal de laatste 3 hebben.
quote:
categorie overigens?
stiekem heb ik helemaal geen tabel catagorie of categorie, maar heeft deze een compleet andere naam. Dit was echter makkelijker uitleggen
pi_31009636
best pittig trouwens, kun je ook queries in queries doen? anders lijkt me dit heel erg omslachtig en zul je idd aan die 18 queries blijven zitte
Just say hi!
  FOK!-Schrikkelbaas woensdag 28 september 2005 @ 21:49:53 #6
1972 Swetsenegger
Egocentrische Narcist
pi_31009824
quote:
Op woensdag 28 september 2005 20:50 schreef Chandler het volgende:
best pittig trouwens, kun je ook queries in queries doen? anders lijkt me dit heel erg omslachtig en zul je idd aan die 18 queries blijven zitte
Subqueries zijn vanaf mysql 4.1 mogenlijk.
Op de server draait 4.0.27 ofzo

Misschien ter verduidelijking, dit wil ik dus: www.marktplaats.nl
Daar zie je 31 categorieën, met de 5 laatste items. Ik kan me niet voorstellen dat markplaats 32 queries draait op de frontpage, met de hits die zij hebben geeft dat een enorme belasting op je db server denk ik.

Er zou dus een makkelijkere oplossing moeten zijn, of stel ik me nu gewoon teveel voor van een simpele select query mbt serverload?
pi_31010654
Een extra join op products (items bij jou) bevat de producten die boven het product staan (p2.ProductName <= p.ProductName). Dat aantal tel ik, en mag niet groter zijn dan 5.

1
2
3
4
5
6
7
SELECT c.CategoryID, c.CategoryName, p.ProductID, p.ProductName
FROM products p
INNER JOIN categories c ON c.CategoryID = p.categoryID
INNER JOIN products p2 ON p2.CategoryID = c.CategoryID AND p2.ProductName <= p.ProductName
GROUP BY p.ProductID, p.ProductName, c.CategoryID, c.CategoryName
HAVING COUNT(p2.ProductID) <= 5
ORDER BY c.CategoryName, p.ProductName


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CategoryID CategoryName ProductID ProductName
1          Beverages    1         Chai
1          Beverages    2         Chang
1          Beverages    39        Chartreuse verte
1          Beverages    38        Côte de Blaye
1          Beverages    24        Guaraná Fantástica
2          Condiments   3         Aniseed Syrup
2          Condiments   4         Chef Anton's Cajun Seasoning
2          Condiments   5         Chef Anton's Gumbo Mix
2          Condiments   15        Genen Shouyu
2          Condiments   6         Grandma's Boysenberry Spread
3          Confections  48        Chocolade
3          Confections  26        Gumbär Gummibärchen
3          Confections  49        Maxilaku
3          Confections  25        NuNuCa Nuß-Nougat-Creme
3          Confections  16        Pavlova
Wil iedereen die in telekinese gelooft nu mijn hand op steken?
| Foto's van toen en nu | Icons | Whatpulse keyboard | .NET developer? |
  FOK!-Schrikkelbaas woensdag 28 september 2005 @ 22:17:41 #8
1972 Swetsenegger
Egocentrische Narcist
pi_31010770
quote:
Op woensdag 28 september 2005 22:14 schreef SuperRembo het volgende:
bevat de producten die boven het product staan
Ik ga 'm zometeen ff uitproberen
Maar deze zinsnede begrijp ik even niet
  woensdag 28 september 2005 @ 22:22:36 #9
71919 wonderer
Hung like a My Little Pony
pi_31010923
Om even terug te komen op dat watermerk, trim() loste het rare ding op.

Nu wil ik alleen nog even weten hoe ik met andere lettertypen kan klooien. Kan ik die zelf op de server zetten, of moeten die er al staan, en zo ja, hoe kom ik erachter welke fonts er op de server geinstalleerd zijn?
"Pain is my friend. I can trust pain. I can trust pain to make my life utterly miserable."
"My brain is too smart for me."
"We don't need no education." "Yes you do, you just used a double negative."
  FOK!-Schrikkelbaas woensdag 28 september 2005 @ 22:22:47 #10
1972 Swetsenegger
Egocentrische Narcist
pi_31010926
Sterker nog, ik begrijp geen moer van je query
Even kijken, in ieder geval ga je met tabel aliassen werken. Hmz, eens even kijken hoe ik dat voor mijn probleem ga gebruiken. Plus ook dat ik in mijn tabel item niet de categorie id heb opgeslagen, maar echt de catagorie naam

-Edit-
WHAAAH! Het werkt!!!
Ik snap er werkelijk ergnstig weinig van
Kan je 'm ontleden SR? Ik wil 'm graag ook snappen eigenlijk.

[ Bericht 22% gewijzigd door Swetsenegger op 28-09-2005 22:31:50 ]
pi_31011425
quote:
Op woensdag 28 september 2005 22:22 schreef Swetsenegger het volgende:
Sterker nog, ik begrijp geen moer van je query
Ja, hij is wat lastig om zo ff kort uit te leggen. Wat ook nog belangrijk is, is dat de joinconditie van de 2e products tabel (p2.CategoryID = c.CategoryID AND p2.ProductName <= p.ProductName) en de sortering van het resultaat (ORDER BY c.CategoryName, p.ProductName) bij elkaar horen. Misschien moet je zelf ff spelen met de query, en 'm eens uitvoeren met de COUNT(p2.ProductID) in 't resultaat of een keerte zonder group bij.
quote:
Even kijken, in ieder geval ga je met tabel aliassen werken.
Dat is om het kort en overzichtelijk te houden. Ik gebruik ook 2 x de tabel products, dus ik moet wel een alias gebruiken.
quote:
Hmz, eens even kijken hoe ik dat voor mijn probleem ga gebruiken. Plus ook dat ik in mijn tabel item niet de categorie id heb opgeslagen, maar echt de catagorie naam
Ai, ik hoopte dat dat bij het vereenvoudigde voorbeeld hoorde
Wil iedereen die in telekinese gelooft nu mijn hand op steken?
| Foto's van toen en nu | Icons | Whatpulse keyboard | .NET developer? |
  FOK!-Schrikkelbaas woensdag 28 september 2005 @ 22:41:32 #12
1972 Swetsenegger
Egocentrische Narcist
pi_31011698
quote:
Op woensdag 28 september 2005 22:35 schreef SuperRembo het volgende:

[..]

Ja, hij is wat lastig om zo ff kort uit te leggen. Wat ook nog belangrijk is, is dat de joinconditie van de 2e products tabel (p2.CategoryID = c.CategoryID AND p2.ProductName <= p.ProductName) en de sortering van het resultaat (ORDER BY c.CategoryName, p.ProductName) bij elkaar horen. Misschien moet je zelf ff spelen met de query, en 'm eens uitvoeren met de COUNT(p2.ProductID) in 't resultaat of een keerte zonder group bij.
[..]

Dat is om het kort en overzichtelijk te houden. Ik gebruik ook 2 x de tabel products, dus ik moet wel een alias gebruiken.
[..]

Ai, ik hoopte dat dat bij het vereenvoudigde voorbeeld hoorde
Ja ik ben al aan het experimenteren, want het gaat niet helemaal goed.
Hij pakt inderdaad 3 records (waar er tenminste 3 records zijn in de categorie)... maar niet de 3 laatste.

Het lijkt wel of hij ze willekeurig pakt.
pi_31012133
Overigens zou ik het anders hebben aangepakt en bij het toevoegen van een nieuwe item een extra veld updaten dat van 1 t/m 5 loopt en de positie van dat item in de lijst weergeeft. Bij het toevoegen van een item hoef je alleen dat veld te incrementen indien het lager is dan 6, en kun je in de query sorteren op dat veld (ASC weliswaar) en een WHERE-clause maken met veld < 6 beetje een hack, maar het werkt wel.
Stuur een PM naar me met als onderwerp stats help voor je userstatistieken!
Boom Gaspar - Matt Cameron - Jeff Ament - Stone Gossard - Mike McCready - Eddie Vedder.
  FOK!-Schrikkelbaas woensdag 28 september 2005 @ 22:58:00 #14
1972 Swetsenegger
Egocentrische Narcist
pi_31012372
Ok Ik heb SR's query nu zover dat hij de EERSTE 3 per catagorie pakt

(Hij pakte eerst 'willekeurig' omdat ik op een title aan het sorteren was Dan krijg je gewoon de titels welke beginnen met A, vervolgens met B per categorie terug natuurlijk, dom dom dom )

Nu nog de LAATSTE 3.
De query is nu dit (met de orignele tabel namen. genre is gelijk aan categorie en ad is gelijk aan item.)

1
2
3
4
5
6
7
SELECT g.genre, a.title, a.ad_id
FROM genre g
INNER JOIN ad a ON a.genre = g.genre
INNER JOIN ad a2 ON a2.genre = g.genre AND a2.ad_id <= a.ad_id
GROUP BY a.title
HAVING COUNT(a2.ad_id) <= 3
ORDER BY g.genre, a.ad_id DESC


-edit

Swets..., de volgende keer ff dieper nadenken

1
2
3
4
5
6
7
SELECT g.genre, a.title, a.ad_id
FROM genre g
INNER JOIN ad a ON a.genre = g.genre
INNER JOIN ad a2 ON a2.genre = g.genre AND a.ad_id <= a2.ad_id
GROUP BY a.title
HAVING COUNT(a2.ad_id) <= 3
ORDER BY g.genre, a.ad_id DESC


Bedankt voor het meedenken!
pi_31017865
SuperRembo, dat ziet er weer eens super Topf uit man!... wat een knowledge
Just say hi!
pi_31017912
Nog even ter verduidelijjking. Als je wel subquery's kan gebruiken, dan zou je de query zo schrijven:

1
2
3
4
5
6
7
8
9
SELECT c.CategoryID, c.CategoryName, p.ProductID, p.ProductName,
FROM products p
INNER JOIN categories c ON c.CategoryID = p.categoryID
WHERE (
   SELECT COUNT(*) 
   FROM products p2 
   WHERE p2.CategoryID = c.CategoryID AND p2.ProductName <= p.ProductName
) <= 5
ORDER BY c.CategoryName, p.ProductName
Wil iedereen die in telekinese gelooft nu mijn hand op steken?
| Foto's van toen en nu | Icons | Whatpulse keyboard | .NET developer? |
  FOK!-Schrikkelbaas donderdag 29 september 2005 @ 09:42:28 #17
1972 Swetsenegger
Egocentrische Narcist
pi_31019441
quote:
Op donderdag 29 september 2005 07:26 schreef Chandler het volgende:
SuperRembo, dat ziet er weer eens super Topf uit man!... wat een knowledge
Het verbaast me altijd dat ik voor echt complexe queries en vraagstukken hier WEL een antwoord of een goed idee krijg van mensen als SuperRembo en Roonaan, terwijl op phpfreakz.nl, bij uitstek de php vraagbaak, meestal niet.
pi_31020241
quote:
Op donderdag 29 september 2005 09:42 schreef Swetsenegger het volgende:

[..]

Het verbaast me altijd dat ik voor echt complexe queries en vraagstukken hier WEL een antwoord of een goed idee krijg van mensen als SuperRembo en Roonaan, terwijl op phpfreakz.nl, bij uitstek de php vraagbaak, meestal niet.
Yups, ik dank ook veel aan hun
  FOK!-Schrikkelbaas donderdag 29 september 2005 @ 11:20:56 #19
1972 Swetsenegger
Egocentrische Narcist
pi_31021829
quote:
Op donderdag 29 september 2005 10:16 schreef Darkomen het volgende:

[..]

Yups, ik dank ook veel aan hun
Ik zeg, we maken een walk of fame in de OP
pi_31022269
Altijd baas boven baas, he persoonlijk ga ik met PHP-problemen (if any) altijd op Fok! zoeken en problemen in andere talen vuur ik wel op Tweakers af
Stuur een PM naar me met als onderwerp stats help voor je userstatistieken!
Boom Gaspar - Matt Cameron - Jeff Ament - Stone Gossard - Mike McCready - Eddie Vedder.
  FOK!-Schrikkelbaas donderdag 29 september 2005 @ 11:42:25 #21
1972 Swetsenegger
Egocentrische Narcist
pi_31022490
quote:
Op donderdag 29 september 2005 11:35 schreef JeRa het volgende:
Altijd baas boven baas, he persoonlijk ga ik met PHP-problemen (if any) altijd op Fok! zoeken en problemen in andere talen vuur ik wel op Tweakers af
Van de tweakers heb ik ook een aantal keren goede suggesties gehad.

Alleen zijn ze daar minder geduldig en uitleggerig
pi_31053306
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
<?php
if($_GET['id'] == 'link')

  include("link.php");
}   
elseif($_GET['id'] == 'news')

  include("news.php");
}   
elseif($_GET['id'] == 'ticket')

  include("ticket.php");
}
elseif($_GET['id'] == 'contact')

  include("contact.php");
}
elseif($_GET['id'] == 'link_add')

  include("link_add.php");
}
elseif($_GET['id'] == 'link_edit')

  include("link_edit.php");
}
else
{
   include("main.php");
}
?>


hier roep ik de pagina's mee aan maar als ik nu zeg maar link_edit wil doen komt er ?id=3 achter zeg maar omdat ik die bepaalde link wil wijzigen.
dus dan wordt de voledige url index.php?id=link_edit?id=3 en dat werkt niet.
Hoe zou ik dat het beste kunnen oplossen?

Mijn dank is groot
  vrijdag 30 september 2005 @ 11:31:06 #23
125047 Lamme_Sterfkanarie
tweet tweet en dan ineens niet
pi_31053718
index.php?id=link_edit&id=3

let op de &

[ Bericht 77% gewijzigd door Lamme_Sterfkanarie op 30-09-2005 11:38:00 ]
Ik heb het godverdomme gehad met die onkunde van je!
  vrijdag 30 september 2005 @ 11:55:07 #25
125047 Lamme_Sterfkanarie
tweet tweet en dan ineens niet
pi_31054525
ik zou het trouwens zo oplossen:

1
2
3
4
5
6
7
8
9
10
<?php
$files
= array("bestand1", "bestand2", "bestand3");

if(isset(
$_GET['file'] && in_array($_GET['file'], $files)){
    include(
$_GET['file'] . ".php");
}
else {
   include(
"main.php");
}
?>


mogelijke bugs daargelaten, niet getest
je hebt nu trouwens ook 2x id in je url staan. dat gaat ook niet werken vandaar dat ik de eerste id hernoemd naar file heb.
Ik heb het godverdomme gehad met die onkunde van je!
abonnement Unibet Coolblue
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')