8791 sujets

Développement web côté serveur, CMS

Bonjour,

Je fais appel à vous car j'ai une requête que je n'arrive pas à terminer d'écrire ! Une aide me permettra de mettre enfin en ligne mon projet. Smiley smile

J'ai une table newsfeed qui constitue le fil d'actualité de mon site : l'activité de chaque membre "user_ID" et de chaque page "page_ID" y est consigné. "action_type" désigne la nature de l'action et tout les champs non concernés par cette action sont mis à NULL. L'action "pg_subscription" désigne l'abonnement d'un membre à une page "pg_ID", "pg_link" une age qui est liée à une autre, etc.

EX: friendship désigne une liaison d'amitié avec un autre membre donc seul "friend_ID" sera remplie et les champs restant seront à NULL.

http://oi45.tinypic.com/2lu86z6.jpg

La table friends_linked sert à afficher un fil d'actualité qui concerne uniquement les amis de l'utilisateur :
http://i48.tinypic.com/2zfsch0_th.jpg

La table members_pages sert à afficher un fil d'actualité qui concerne uniquement les pages auxquelles l'utilisateur est abonné :
http://oi48.tinypic.com/16m5ahs.jpg

Le but est d'afficher à un membre l'actualité de ses amis et des pages auxquelles il est abonné via une seule requête (la table membres contient les infos membres, pages idem pour les pages et newsfeed_like les likes associés à chaque action d'un membre):

"SELECT COALESCE (n.user_ID, n.page_ID) AS subject_id, 
	COALESCE (mFrom.nom_utilisateur, pFrom.name) AS subject_name,
        COALESCE (mFrom.miniature, pFrom.miniature2) AS subject_mini,
	n.action_type AS action,
	UNIX_TIMESTAMP(n.date_action) AS action_date,	
	IF( SUM( nl.liked ) - SUM( nl.disliked ) IS NULL, 0, SUM( nl.liked ) ) AS vote,
	COALESCE (n.friend_ID, n.pg_ID, n.rk_ID) AS item_id,	
	COALESCE (mTo.nom_utilisateur, pTo.name, r.name) AS item_name,	
	COALESCE (mTo.miniature, pTo.miniature2, r.miniature2) AS item_mini,
FROM newsfeed n 
LEFT OUTER JOIN friends_linked fl	
	ON n.user_ID = (fl.friend_from + fl.friend_to - :id_utilisateur)	
LEFT OUTER JOIN members_pages mp
	ON n.page_ID = mp.page AND mp.member = :id_utilisateur AND mp.deleted = '0'			
LEFT OUTER JOIN membres mFrom
	ON mFrom.id = n.user_ID		
LEFT OUTER JOIN pages pFrom
	ON pFrom.page_ID = n.page_ID			
LEFT OUTER JOIN newsfeed_like nl
	ON n.ID = nl.news_ID				
LEFT OUTER JOIN membres mTo
	ON mTo.id = n.friend_ID				
LEFT OUTER JOIN pages pTo
	ON pTo.page_ID = n.pg_ID 
LEFT OUTER JOIN rankings r
	ON r.ranking_ID = n.rk_ID					
WHERE (fl.friend_from = :id_utilisateur OR fl.friend_to = :id_utilisateur)
	AND fl.friend_confirm = :friend_confirm	
GROUP BY n.ID	
ORDER BY n.date_action DESC"


Cette requête affiche bien l'activité des amis de :id_utilisateur mais aussi l'activité des pages auxquelles il n'est pas abonné !
Modifié par Tchernobyl (27 Jul 2012 - 01:10)