[MySQL] SELECT avec valeur conditionnelle [Résolu]

:hello:

J’ai une table avec des articles, et une table qui indique si tel ou tel utilisateur a déjà lu l’article.

Lorsque je j’affiche un ou plusieurs articles j’aimerais faire un traitement différent si l’utilisateur a déjà lu l’article ou non.

Donc dans ma requete MySQL j’aimerais avoir un champ qui me renseigne si l’article a été lu.

bien sûr je n’aimerais pas faire une requete par articles, imaginez quand je liste 25 articles.

Dans ma table de “lecture” j’ai juste deux champs, user_id et article_id.

logiquement, il n’y a d’enregistrement que si l’utilisateur a lu l’article.

vous avez une idée sur la façon de gérer ça ?

merci :slight_smile:

Désolé, je ne me souviens pas trop de la syntaxe SQL de MySQL, mais une jointure externe sur la table lecture devrait marcher, i.e. si la valeur ramenée de ta table lecture est null, l’utilisateur n’a pas lu l’article

J’ai pensé à ça.

ça fonctionnait en local lorsque je n’avais qu’un utilisateur (moi)

mais lorsqu’il y a plusieurs utilisateurs, ça prend le premier, peu importe que ça soit toi ou pas :confused:

Si tu veux afficher un rendu pour un utilisateur donné, c’est que tu as son id…

Un truc du genre (en syntaxe Oracle)

SELECT ARTICLE.CONTENU, LECTURE.USER_ID
FROM ARTICLE, LECTURE
WHERE LECTURE.USER_ID = 'xxx'
AND ARTICLE.ARTICLE_ID = LECTURE.ARTICLE_ID(+)

mais avec cette liaison, je ne vais avoir que les articles lus, je n’aurais pèas les autres vu que lecture.user_id n’existe pas. :neutre:

Il faut un jointure ouverte, left join ou right join, et même si lecture.user_id n’existe pas, ça te renverra l’élément. cette jointure ouverte s’écrit bien (+) dans Oracle comme le fait [myself]

J’ai trouvé une définition très simple avec Google :
http://wwwsi.supelec.fr/~yb/poly_bd/node63.html

Plus spécifique MySQL :
http://mysql.developpez.com/faq/?page=COMP…ILITE_jointures

(Dans l’item juste en dessous, tu as un exemple)

euh, j’suis pas sur d’avoir bien compris la question, donc je vais résumer ce que j’ai compris :ane:

tu veux afficher xx articles et afficher differement les articles déjà lu (ou non lu, ça revient au même) en fonction de l’utilisateur ? c’bien ça ? et tu ne veux pas faire une requète par article (c’est bien ça :D)

parce que bon, je vois pas où est la difficulté :neutre: …

1/ tu select les xx articles à afficher
2/ tu select les id des articles lus par l’utilisateur, en limitant les articles à ceux sélectionner plus haut
3/ dans ta boucle qui va lire chacun des articles retourner par 1/, tu regardes si l’id se trouve dans la liste de la requète retourner par 2/ … et tu ensuite tu fais ton traitement en fonction de si c’est lu ou pas lu …

plus simple, je pense t’auras du mal … là ça fait 2 requètes, et je vois pas comment tu pourrais tout faire en une :confused:

quoique …

si tu fais une jointure sur une table, et qu’il n’y a pas d’enregistrement correspondant, alors le champ auras la valeur NULL … donc si tu fais une jointure entre ta table article, et ta table article_lu, et que l’utilisateur n’as pas lu l’article, alors tu auras une valeur NULL :oui: … mais j’ai peur que ça ne select que les articles lus par un user à partir du moment où tu fais un where sur l’id_user :neutre: …

Tu ne récupères pas NULL, tu ne récupères rien du tout… Sauf avec une jointure externe :wink:

Plus simple que 2 requêtes : 1 seule (cf. plus haut), cela évite déjà de faire une requête par article (Ce que NeqO souhaite éviter :wink: )

bah j’en fait pas une par article [:eveden] … et celle du dessus je dis pas, c’est la deuxième idée que j’avais … mais à tester quoi :o

Pour l’instant j’ai un truc dans le genre, avec un LEFT JOIN.

j’ai ça (pour l’instant les utilisateurs sont des IPs)

SELECT * FROM articles a LEFT JOIN ips i ON i.art_id = a.art_id
WHERE i.ip = ‘127.0.0.1’ OR i.ip IS NULL

ça fonctionne presque bien.

le problème c’est quand on autre utilisateur a lu l’article.

il existe un enregistrement dans la table [i]ips/[i] qui n’est ni 127.0.0.1, ni null. Alors l’article ne s’affiche pas, parce qu’il n’entre pas dans la condition du WHERE.

L’idée à Kiss est pas mal :slight_smile:

Mais si quelqu’un a une idée pour une seule requete, ça serait cool :wink:

Si t’es en mySQL 5 t’as pas moyen de faire une fonction ?

vouay j’ai mieux : 0 requète, tu zappes cette fonctionnalité à la mords moi le noeud :o
[:shy]

[:kramoc]

pas de mysql 5 en vue :confused:

ni de moyen de me passer de ça :o :smiley:

pourrais-tu nous donner la structure des tables que tu souhaite faire intervenir dans ta requete ?

merci

rien de plus simple :

articles :

art_id | contenu | […]

liaison :

user_id | art_id

c’est tout ! :slight_smile:

SELECT * FROM articles a LEFT JOIN ips i ON (i.art_id = a.art_id and i.ip = '127.0.0.1')

Youhou ça fonctionne comme ça :bounce:

Je ne savais pas qu’on pouvais mettre une condition dans un ON.

Merci myself et les autres pour leurs idées :oui:

le ON requiert une expression, donc oui…

c’est l’équivalent du WHERE, avec deux trois modifications…