LIMIT 5 ... mais pour chaque catégorie

*nicolas*
Invité n'ayant pas de compte PHPfrance

27 oct. 2006, 16:08

Bonjour à tous, :D

j'aurais voulu savoir comment, avec UNE SEULE REQUETE SQL (ce doit être possible sans devoir utiliser une boucle pour chaque catégorie), on pouvait afficher les 5 derniers enregistrements (--> triage avec la colonne "time" au format timestamp [no prob]) de CHAQUE catégorie [<-- prob].

Une solution pas belle et lourde serait ceci :

Code : Tout sélectionner

$nbr_cat = ... // Récupération du nombre de catégorie for($i=0; $i<$nbr_cat; $i++) { // Requête $query = 'SELECT titre FROM matable WHERE cat='.$i.' ORDER BY time DESC LIMIT 5'; $result = mysql_query($query); $tab = mysql_fetch_assoc($result); // Affichage echo '5 derniers enregistrements de la catégorie n°'.$i.' :'; echo $tab['titre']; }
mais je voudrais n'utiliser QUE du SQL, pour pouvoir afficher ce résultat sous forme de tableau dans PhpMyAdmin ou la console mysql par exemple.

Un très grand merci d'avance. :)

*nicolas*
Invité n'ayant pas de compte PHPfrance

27 oct. 2006, 16:13

Oups, me suis gourré.
Il ne faut pas de $tab = mysql_fetch_assoc($result) car il doit se trouver dans un while($tab = mysql_fetch_assoc($result)) pour afficher les 5 titres... :oops:
Mais de toute façon, mon but est de le faire SANS php. :)

Mammouth du PHP | 19672 Messages

28 oct. 2006, 03:27

Mais de toute façon, mon but est de le faire SANS php. :)
Pour communiquer avec un SGBD quel qu'il soit, tu auras de toutes façon d'un langage serveur : PHP, ASP, .Net ou Java, ce que tu voudras, mais tu ne pourras pas faire sans. À moins qu'il manque une partie importante dans l'énoncé de ta question.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 1961 Messages

28 oct. 2006, 03:52

Bonsoir,

Je crois que ce qu'il veut dire c'est récupérer le résultat sur une seule requète sans boucler (PHP) sur la requète en changeant la valeur de la catégorie.

La requète je ne saurais pas la fournir.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 19672 Messages

28 oct. 2006, 03:59

ok, d'accord : mais dans ce cas, il serait bien de nous donner de la matière :
-1- structure de la table (ou des tables) où seront récupérées les données
-2- jeu d'essai de base pour peupler une base de test en local
-3- un tableau créé manuellement sur la base du jeu d'essai et contenant ce qui est attentu à la sortie.

À partir de là on peut faire des essais, mais sinon, ça va pas être évident à coup de devinettes :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 5 Messages

28 oct. 2006, 14:37

En fait, les tables ce sont celles de PunBB. Du fait de cette nouvelle précision, je préciserais également que les catégories que je vous parlais sont en fait ici les forums (colonne forum_id) [comme les catégories dans PunBB ont un autre sens à savoir des groupements de forums...].

D'où le fait que j'ai rendu plus simple les choses, mon but étant juste de savoir si vous connaissez de tête une sorte de "LIMIT forum_id 5" (pour faire ceci en UNE requête SQL où je peux sortir dans PhpMyAdmin par ex., les 5 derniers enregistrements de CHAQUE forum comme l'a bien compris "Ajoloca" ;)).

Pour l'exemple, ce serait ceci comme table simplifiée (plus que suffisant pour quelqu'un connaissant ce ou ces fameux mots clés manquants dans la requête) :

Code : Tout sélectionner

ID | titre | time | forum_id 1 aaa 1111 1 3 aaa 1101 1 6 aaa 1922 2 5 aaa 1310 1 2 aaa 1511 1 8 aaa 1325 3 7 aaa 1745 2 4 aaa 1141 1 9 aaa 1415 3
et mon but est de sortir ceci :

Code : Tout sélectionner

ID | titre | time | forum_id 2 aaa 1511 1 5 aaa 1310 1 4 aaa 1141 1 1 aaa 1111 1 3 aaa 1101 1 -- 6 aaa 1922 2 7 aaa 1745 2 -- 9 aaa 1415 3 8 aaa 1325 3
Pour chaque forum_id, ça sort les 5 DERNIERS enregistrements [moins s'il n'y en a pas 5 comme les forums id 2 et 3] (ORDER BY time DESC pour chaque forum_id donc <-- le prob est là : "l'appliquer pour CHAQUE forum_id indépendamment, le tout en une seule requête et donc, en un seul résultat").

Ce doit pas être bien dur mais Google ne m'aide pas beaucoup sur ce coup-là...

Merci d'avance. :)

Petit nouveau ! | 5 Messages

02 nov. 2006, 15:25

J'aime pas les up mais... vraiment personne ? :-(

En gros, il me faudrait afficher avec une seule requête (donc pas de requête dans un WHILE ou un FOR par ex.), les 5 derniers topics de chaque forum. Voilà en résumé. :-)

Mammouth du PHP | 19672 Messages

03 nov. 2006, 08:21

Hello,
de la part de Hubert Roksor : Ce que tu cherches à faire "est impossible à faire en une requête (enfin, si, c'est possible dans une requête de 30 lignes qui fait 2-3 full-table scans)" et ce "sera bien mieux avec une procédure stockées ou même une boucle PHP, avec un index sur (cat,time) la requête sera quasi-instantannée.".

Voilà, Hubert n'est pas en état de répondre lui-même, et a demandé qu'on te transmette cette information.
++
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 656 Messages

03 nov. 2006, 09:35

Trop fastoche ta demande, tu me laisse 20min, je te pond un code qui va bien.

ViPHP
ViPHP | 656 Messages

03 nov. 2006, 10:00

Bon maintenant si c'est pô ce que tu veu...
<?php

$link = mysqli_connect("localhost", "dba", "passw0rd", "dashboard");
$max     = 5; // Max de categories à traiter 
$sql     = "SELECT titre, cat FROM matable WHERE cat BETWEEN 1 AND ".$max." ORDER BY `time` DESC LIMIT 0, ". 5*$max; 
$myobj   = mysqli_query($link, $sql); 

while ($byrow = mysqli_fetch_assoc($myobj))
{
	$results[] = $byrow;
}

for ($i = 1; $i <= $max; $i++) 
{ 
    echo("<h1>Nous somme dans la catégorie : ".$i."</h1><br />Il y a comme titres :<ul>"); 
     
    foreach ($results  as $curr) 
    {
        if ($curr["cat"] == $i) 
        { 
            echo("<li>".$curr["titre"]."</li>"); 
        } 
    } 
     
    echo("</ul>"); 
} 

mysqli_close($link);

?>
PS: ya peut-être des bétises, mais j'ai pas de MySQL sur ma station, enfin que du MySQLi.

Petit nouveau ! | 5 Messages

03 nov. 2006, 18:22

Si c'est pas gentil ça ! J'en demandais pas tant ! ^^
Je voulais juste savoir si c'était possible sans PHP (et sans PL/SQL) mais comme ce n'est pas le cas apparemment, je comptais le faire en PHP mais... c'est déjà fait (par Ultiny) ! :D Merci ! Je teste ça rapidement et je te dis quoi. ;)