PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 30-04-2013 17:59:30

mastersystem60
Membre
Inscription : 23-02-2013
Messages : 9

[RÉSOLU] Intérogation de deux tables avec condition particulière

Bonsoir,

J'ai réalisé une petite gestion de message avec deux tables.

La table "postit" contient les message des utilisateurs et la table "postit_vu" contient les ID des personnes qui ont vu les messages.

Il y a donc une requête qui affiche les messages avec dans chacun d'eux le nom des personnes qui l'ont lu.


Y a t'il un moyen de dire dans une requête sql sans avoir besoin de parcourir via une boucle les messages pour les vérifier un à un,
le nombre de message que je n'est pas lu ?

merci d'avance

Dernière modification par mastersystem60 (30-04-2013 20:21:01)

Hors ligne

#2 30-04-2013 18:36:03

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [RÉSOLU] Intérogation de deux tables avec condition particulière

mastersystem60 a écrit :

Y a t'il un moyen de dire dans une requête sql sans avoir besoin de parcourir via une boucle les messages pour les vérifier un à un,
le nombre de message que je n'ai pas lu ?

Oui. lol


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#3 30-04-2013 18:51:46

mastersystem60
Membre
Inscription : 23-02-2013
Messages : 9

Re : [RÉSOLU] Intérogation de deux tables avec condition particulière

Elle est terrible ta réponse, lol

Hors ligne

#4 30-04-2013 19:07:25

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [RÉSOLU] Intérogation de deux tables avec condition particulière

Bon, plus sérieusement, comme j'ignore la structure de tes tables, ça donnerait qqe chose comme ça

SELECT COUNT(*) AS non_lus
FROM postit AS p
LEFT JOIN  postit_vu AS pv ON p.id=pv.id AND pv.userid=$moi
WHERE pv.id IS NULL

Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#5 30-04-2013 19:43:21

mastersystem60
Membre
Inscription : 23-02-2013
Messages : 9

Re : [RÉSOLU] Intérogation de deux tables avec condition particulière

La structure pour la table "postit"

ID     |     TEXTE     |     DATE_DEPOT

La structure pour la table "postit_vu"

ID     |     ID_POSTIT     |     ID_LECTEUR

La liaison et effective entre POSTIT.ID et POSTIT_VU.ID_POSTIT

encore merci pour ton aide, je vais tester ta requête smile

Hors ligne

#6 30-04-2013 20:20:33

mastersystem60
Membre
Inscription : 23-02-2013
Messages : 9

Re : [RÉSOLU] Intérogation de deux tables avec condition particulière

Un grand merci pour ton aide Maljuna Kris et bonne fin de journée à toi ++

Dernière modification par mastersystem60 (01-05-2013 09:57:16)

Hors ligne

#7 01-05-2013 09:33:14

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [RÉSOLU] Intérogation de deux tables avec condition particulière

En fait, je pense que la requête ne fait pas tout à fait ce qui tu attends.
Je crois qu'il faut d'abord filtrer postit_vu dans une sous-requête, c.a.d. seulement les posts visités par cet user, et c'est cette sous-requête qu'il faut mettre en jointure externe avec la table postit

 SELECT COUNT(*) AS non_lus
FROM postit AS p
LEFT JOIN (SELECT ID_POSTIT FROM postit_vu WHERE ID_POSTIT=$moi) AS pv
       ON pv.ID_POSTIT = p.ID
WHERE pv.ID_POSTIT IS NULL

J'espère que tu comprendras la subtilité, dans la première version les posts visités par d'autres users auraient aussi été comptablisés par IS NULL, et comme on ne faisait pas COUNT(DISTINCT  p.ID) mais COUNT(*) tu aurais pu te retrouver avec un nombre de posts non-visités supérieur au nombre de lignes de la table postit.
Suis-je assez clair ?


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#8 01-05-2013 10:04:24

mastersystem60
Membre
Inscription : 23-02-2013
Messages : 9

Re : [RÉSOLU] Intérogation de deux tables avec condition particulière

Merci Maljuna Kris j'ai compris, ta première requête est quand même bonne pour ma situation car j'ai un bouton "Vu" pour chaque message qui indique que l'utilisateur a bien pris conscience de l'information.
Ce bouton n'apparaît plus quand le message a été lu par l'utilisateur donc impossible d'ajouter une lecture de plus dans la table "postit_vu".

Je prends note de ton autre requête et te remercie une nouvelle fois pour ton aide tongue

Hors ligne

#9 01-05-2013 18:06:13

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : [RÉSOLU] Intérogation de deux tables avec condition particulière

Bonjour,

Je me permets d'apporter ici un complément d'information concernant le contexte d'application. Cette requête, bien que parfaitement fonctionnelle et juste, reste peu performante du principalement au fait que la colonne de filtrage porte sur une colonne non indexée qui oblige a faire un full scan sur la jointure au niveau du plan de la requête. Ceci est malheureusement dû aux limitations des possibilités qu'offre MySQL.

La solution pour accroître les performances en MySQL, serait de travailler au niveau de l'index censé être posé sur la colonne id_postit via une approche non relationnelle (malheureusement) via un NOT IN sur la clause WHERE.


SELECT COUNT(ID)
FROM postit
WHERE ID NOT IN (SELECT ID_POSTIT FROM postit_vu WHERE ID_POSTIT=$id_recherche)
 

Et encore les performances recherchées n'y seraient pas totalement garanties car fortement dépendantes du caractère discriminant de l'index.

Une manière plus propre (dans le sens ensembliste) de faire cela en SQL mais sur un autre SGBDR serait de passer par un EXCEPT ALL ou par une requête fenêtrée.

++

EDIT

Y a t'il un moyen de dire dans une requête sql sans avoir besoin de parcourir via une boucle les messages pour les vérifier un à un,
le nombre de message que je n'ai pas lu ?

Après relecture de l'énoncé, la requête présente une inexactitude et doit être corrigée ainsi


SELECT COUNT(ID)
FROM postit
WHERE ID NOT IN (SELECT ID_POSTIT FROM postit_vu WHERE ID_LECTEUR=$id_lecteur)
 

Dernière modification par Jc (03-05-2013 08:05:45)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

Pied de page des forums