login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Subquery: meer rijen

Offline webstab - 02/11/2007 17:55 (laatste wijziging 02/11/2007 17:56)
Avatar van webstabPHP ver gevorderde Ik wil het volgende resultaat
Citaat:
Game 1
> Score
> Score
> Score
> Score
> Score
Game 2
> Score
> ...

En mijn bedoeling was op mijn phpcode er ongeveer zo te laten uitzien
  1. while ($game = mysql_fetch_array(...)) {
  2. echo $game['titel']."<br />";
  3. foreach ($game['scores'] AS $score) {
  4. echo "&nbsp;>".$score."<br />";
  5. }
  6. }

En mijn query ziet er momenteel zo uit.
  1. SELECT games_game.titel AS titel, games_cat.titel AS cat, games_game.id AS id,
  2. (SELECT games_scores.score AS score FROM games_scores WHERE games_scores.game = games_game.id ORDER BY score DESC LIMIT 5) AS scores
  3. FROM games_game
  4. LEFT JOIN games_cat ON (games_game.cat = games_cat.id)
  5. GROUP BY games_game.id
  6. LIMIT 0,25
Maar dit werkt (logisch) niet, omdat de subquery, meer rijen teruggeeft.
Wanneer ik LIMIT 5 verander naar LIMIT 1 werkt het wel.

Weet er iemand hiervoor een oplossing?

PS: Enkel mysql-code, php-code kan ik wel. (en deze is snel geschreven zonder te controleren dus er kunnen fouten inzitten)

8 antwoorden

Gesponsorde links
Offline ranco - 02/11/2007 20:53
Avatar van ranco PHP gevorderde Misschien makkelijker om een nieuwe query aan te roepen binnen je for each? Zodoende kan je je query versimpelen en wordt wellicht de fout bekend
Offline webstab - 02/11/2007 21:47
Avatar van webstab PHP ver gevorderde Dat ik in die lus ook een query kan zetten, daar heb ik ook wel aan gedacht.

Maar als je dan eventjes verder denkt.

25 games per pagina
Dan hebben we 1 query per game
En dan nog standaard 1 query (voor het doorlopen van de games)
En nog een query voor de navigatie.
Dat brengt het totaal op 28 query's per gamepagina.

Terwijl het zeker in één query kan. (zeker gezien de laadtijd)

Ik weet wat ik fout doe, maar ik weet niet direct een andere manier hoe ik het kan oplossen.
Offline bosgroen - 03/11/2007 18:21 (laatste wijziging 03/11/2007 18:23)
Avatar van bosgroen Gouden medaille

PHP interesse
jep, in 1 query, haal gewoon de scores op (en join aan de game details, dus een tweede join); dan krijg je zoiets terug van mysql:

Score Game1 gamenaamX
Score Game1 gamenaamX
Score Game1 gamenaamX
Score Game1 gamenaamX
Score Game1 gamenaamX
Score Game2 gamenaamY
... Game2 gamenaamY


met php zet je het dan om naar:
Game 1 gamenaamX
> Score
> Score
> Score
> Score
> Score
Game 2 gamenaamY
> Score
> ...
Offline webstab - 04/11/2007 11:18 (laatste wijziging 04/11/2007 11:18)
Avatar van webstab PHP ver gevorderde Daar heb ik ook al aan gedacht, en volgens mij moet het zo, maar dan kom je het volgende probleem tegen.

Hoe zorgt je dat er maar maximaal 5 scores per game zijn?
(Mag minder, mag ook geen zijn)

Want bij sommige games staan er meer dan 50 scores in de database en hij moet dan de 5 beste PER GAME eruit halen.
Offline Wim - 04/11/2007 19:41 (laatste wijziging 04/11/2007 19:42)
Avatar van Wim Crew algemeen ORDER BY games_scores.score DESC LIMIT 0,5?
Offline webstab - 04/11/2007 19:54
Avatar van webstab PHP ver gevorderde Maar dan krijg je toch maar 5 scores?

Ik wil 25 games met bij ieder game maximaal 5 scores.
Offline Dark_Paul - 04/11/2007 20:03
Avatar van Dark_Paul PHP ver gevorderde
  1. SELECT gameID, gameNaam (SELECT score FROM scores WHERE gameID = games.gameID LIMIT 5) AS scores FROM games

Zoiets kan toch?
Ik weet alleen niet goed hoe dat gaat als die subquery meerdere resultaten terugstuurt.
Offline webstab - 04/11/2007 20:21 (laatste wijziging 06/11/2007 11:56)
Avatar van webstab PHP ver gevorderde Die query staat ook in mijn startpost.
Een subquery mag (op die manier) geen meerdere resultaten weergeven.

Voor al de geïnteresseerden, mijn query ziet er zo uit momenteel:
  1. SELECT games_game.titel AS titel, games_game.id AS id, games_cat.titel AS cat, games_game.zichtbaar AS zichtbaar,
  2. SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT CONCAT(games_scores.score,CONCAT(';',games_scores.user)) ORDER BY games_scores.score DESC, games_scores.id ASC),',',10) AS scores,
  3. SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT CONCAT(leden.id,CONCAT(';',CONCAT(leden.naam,CONCAT(';',leden.groep)))) ORDER BY games_scores.score DESC, games_scores.id ASC),',',10) AS users,
  4. SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT CONCAT(groepen.id, CONCAT(';',groepen.class)) ORDER BY groepen.id ASC),',',10) AS classes,
  5. (SELECT SUM(games_scores.aantal) AS gespeeld FROM games_scores WHERE games_scores.game = games_game.id) AS gespeeld,
  6. (SELECT SUM(games_scores.aantal) AS gespeeld_maand FROM games_scores
  7. WHERE games_scores.game = games_game.id AND MONTH(datum) = MONTH(NOW()) AND YEAR(datum) = YEAR(NOW())) AS gespeeld_maand
  8. FROM games_game
  9. LEFT JOIN games_cat ON (games_game.cat = games_cat.id)
  10. LEFT JOIN games_scores ON (games_game.id = games_scores.game)
  11. LEFT JOIN leden ON (games_scores.user = leden.id)
  12. LEFT JOIN groepen ON (leden.groep = groepen.class)
  13. WHERE games_cat.titel = 'Actie' AND MONTH(games_scores.datum) = MONTH(NOW()) AND YEAR(games_scores.datum) = YEAR(NOW())
  14. GROUP BY games_game.id
  15. ORDER BY gespeeld_maand DESC
  16. LIMIT 10;


Deze query geeft het gewenste resultaat, maar is alles behalve ideaal geschreven.
(Een nadeel is dat GROUP_CONCAT geen LIMIT ondersteunt)
Kan er iemand deze nog verbeteren/optimaliseren? Of zal het zo blijven?
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.193s