Page 1 sur 1

count() multiples

Posté : 16 sept. 2008, 16:03
par katagoto
Bonjour,

je travail actuellement sur un site "banale" niveau code, et je dois récupérer le nombre de message lu/non-lu de chaque membres, jusqu'ici pas de problème, je les récupère à intervalle régulière. Seulement, pour diminuer encore le nombre de requêtes, je vais faire un cache SQL, c'est à dire que le compte des lectures/non-lecture/ajout/supression sera fait au fur et à mesure, ainsi je pourrais récupérer tout les nombres d'un coup. Seulement, par mesure de sécurité, et parce que je sais que rien n'est infaillible. J'aimerais faire un re-compte "naturel" périodiquement. Pour le périodiquement, pas de problème, mais voilà, comment faire un count() "multiple", voilà comment je le schématiserais en PHP :
$pdo->query("SELECT count(*) AS non_lu FROM messages WHERE etat='0' AND fk_membre='$fk_membre'; SELECT count(*) AS total WHERE AND fk_membre='$fk_membre';");
//...
$pdo->exec("UPDATE messages SET non_lu='$non-lu', total='$total' WHERE fk_membre='$fk_membre'");
Bon, j'ai fais ça vite fait, sans les méthodes préparé ni le fetch, et je doûte de la validité des requête, mais c'est pour votre compréhension.

Cecis marche pour 1 membre, comment faire ça pour tous, sans faire péter le serveur :lol:

Par avance merci de votre aide

PS : je suis sous PostGreSQL 8.3.3

Posté : 16 sept. 2008, 18:12
par caroube
Pourquoi est-ce que tu n'essayes pas un truc du style

Code : Tout sélectionner

SELECT count(*) AS cpte, 'non_lu' as type_data FROM messages WHERE etat='0' AND fk_membre='$fk_membre' union SELECT count(*) AS cpte, 'total' as type_data from ??? WHERE ??? AND fk_membre='$fk_membre

Posté : 16 sept. 2008, 18:23
par katagoto
Je comprend pas ta requête :/
Et puis, y a pas d'UPDATE

Posté : 16 sept. 2008, 18:39
par caroube
Je comprend pas ta requête
Essaye-là, après avoir complété les FROM et les WHERE qui étaient absent dans ton code. :lol:
Ce sont juste les deux count que tu as donné, remis à la sauce SQL.
Et puis, y a pas d'UPDATE
Ben non. Parce que tu voulais faire un update et un select en même temps ? C'était pas vraiment clair. Surtout quand tu intercales des variables PHP

Si tu veux tout faire en même temps, il faut que tu essayes un truc

Code : Tout sélectionner

UPDATE messages A SET A.non_lu= (SELECT count(*) FROM messages B WHERE B.etat='0' AND B.fk_membre=A.fk_membre), A.total = (SELECT sum(*) FROM messages C WHERE C.fk_membre=A.fk_membre)
Mais c'est sacrément moins lisible qu'un bon vieux select, suivi d'une récupération en PHP et d'un update.

Posté : 16 sept. 2008, 19:38
par katagoto
Ok, je me suis mal exprimmer, j'ai ça :

Table : champ 1 | champ 2 |...
message : pk_message | fk_membre (pointe vers pk_membre de la table suivante) | etat (qui est compris entre 0 et 8)
membre : pk_membre | non_lu | total

Soit j'ai pas compris ta requête soit j'ai mal lû, car j'ai vu des sum, non ?

PS : si tu fais bouger la barre horizontale de la fenètre de mon code, tu verra que je n'ais rien oublié ^^

Posté : 17 sept. 2008, 09:18
par caroube
message : pk_message | fk_membre (pointe vers pk_membre de la table suivante) | etat (qui est compris entre 0 et 8)
membre : pk_membre | non_lu | total
Dans le update que tu as indiqué au départ, les champs non_lu et total étaient dans la table messages et pas dans la table membre. Mais il suffit d'adapter la requête update que je t'ai indiqué.
Soit j'ai pas compris ta requête soit j'ai mal lû, car j'ai vu des sum, non ?
Tu met des count si tu veux. Je ne suis pas là pour te donner la solution, mais pour t'indiquer des pistes.
PS : si tu fais bouger la barre horizontale de la fenètre de mon code, tu verra que je n'ais rien oublié ^^
Si TU fais bouger la barre horizontale, tu verras que tu as écris

Code : Tout sélectionner

SELECT count(*) AS total WHERE AND fk_membre='$fk_membre'
dans lequel il manque un FROM et une clause WHERE :evil:

Posté : 17 sept. 2008, 15:38
par caroube
Et surtout, ne dis pas merci, ni comment tu as résolu ton problème. On ne sait jamais, ça pourrait servir aux autres.

Posté : 17 sept. 2008, 16:18
par katagoto
Oui, ah ce que je vois mon message à été zappé, ou j'ai tout simplement oublié de le posté.

Non, je n'ai pas résolut le problème, mais je prend tes instructions SQL en notes, faut que je les testes et les comprennent...

Cyrano m'a dit un jour que les remerciments était un plus, et pas un tout, mais ça les mérite amplement : merci caroube

Posté : 17 sept. 2008, 18:05
par caroube
A vot' service