2012-03-02 7 views
0

J'ai bien peur d'être un novice de MySQL. J'ai fait beaucoup de lecture pour essayer de résoudre ce problème, mais pour une raison quelconque, je n'ai pas réussi à le faire fonctionner.Comment vérifier l'existence d'une ligne dans une table jointe - MySQL

Espérons que l'un d'entre vous peut aider à ce que, à première vue, devrait être assez simple

J'ai une requête qui sélectionne une liste de commentaires.

$commentquery = "select projects_comments.*, users.user_url, users.display_name 
from ".$wpdb->prefix."projects_comments projects_comments 
left join ".$wpdb->prefix."users users on 
users.ID=projects_comments.userid   
where projectid = '$projectid' 
order by projects_comments.commentid desc"; 

Les utilisateurs peuvent « comme/amour » ces commentaires (pensez facebook)

Je voudrais être en mesure de vérifier si l'utilisateur connecté a aimé/aimé chaque commentaire est revenu de cette requête.

Une troisième table ('comment_loves' qui n'apparaît pas dans la requête ci-dessus) contient commentid, userid, posttime et l'ID utilisateur connecté est accessible via la variable $ userid. Cette troisième table doit être vérifiée pour chaque ligne retournée de la requête.

Pour résumer, essentiellement, je dois ajouter les fonctionnalités suivantes à cette requête:

pour chaque ligne retournée, la ".$wpdb->prefix." table comments_loves doit être vérifiée pour l'existence d'une ligne WHERE userid = $userid AND commentid = commentid de la ligne. S'il existe, il renvoie 'true' ou '1' dans une autre colonne nommée loves.

J'espère que c'est assez clair, et mes excuses si c'est une question simple pour beaucoup d'entre vous. Malgré mes tentatives, je n'ai pas réussi à faire ce travail.

Merci

+0

Ajouté Une balise 'php'. –

Répondre

2

ne peut pas tester en ce moment, mais quelque chose comme ça devrait fonctionner; ajouté une autre jointure gauche pour vérifier votre condition;

SELECT projects_comments.*, 
     users.user_url, 
     users.display_name, 
     comments_loves.userid IS NOT NULL AS loves 
FROM projects_comments projects_comments 
LEFT JOIN users users 
    ON users.ID=projects_comments.userid 
LEFT JOIN comments_loves 
    ON projects_comments.commentid = comments_loves.commentid AND 
    comments_loves.userid = '$userid' 
WHERE projectid = '$projectid' 
ORDER BY projects_comments.commentid DESC 
+0

Merci Joachim, j'ai d'abord essayé la requête de Tony et ça a marché, j'ai maintenant aussi essayé la vôtre et ça marche aussi. Votre méthode d'utilisation de IS NOT NULL serait-elle plus rapide que celle de Tony? Si oui, je vais aller avec votre méthode. Merci – gordyr

+0

J'ai remarqué que votre réponse était la bonne puisque j'ai dû modifier Tony pour que ça marche, même si c'était presque là. La seule modification requise dans votre réponse était le nom de la table comments_loves aurait dû être comment_loves. En dehors de cela, cela a fonctionné immédiatement. – gordyr

+0

@gordyr Je dirais que le résultat final une fois que vous avez modifié sa requête est à peu près la même requête, je viens d'utiliser un raccourci MySQL pour éviter le CASE pendant qu'il tape. –

0

chèque pour un nombre de lignes retourné en utilisant mysql_num_rows tels que

$DBresult = mysql_query($yourQuery, $dbLink); 
$rowCount = mysql_num_rows($DBresult); 

if($rowCount > 0) 
{ 
    //do stuff 
} 
+0

Merci pour la suggestion, mais je ne suis pas sûr de comprendre comment cela pourrait aider. Cela ne ferait que vérifier le nombre de lignes dans ma requête initiale quand je veux vérifier le nombre de lignes d'une 'troisième table' qui correspond à $ userid pour chaque commentid/ligne retournée. Ou est-ce que j'ai mal compris quelque chose? – gordyr

1

Il est juste une jointure externe à vos amours tables

Quelque chose comme

select projects_comments.*, users.user_url, users.display_name, 
case when comment_loves.commentid is null then 0 else 1 end as loves 
from ".$wpdb->prefix."projects_comments projects_comments 
left join ".$wpdb->prefix."users users on users.ID=projects_comments.userid 
outer join ".$wpdb->prefix."comment_loves 
on comment_loves.commentid = projects_comments.commentid 
and comment_loves.userid = projects_comments.userid 
where projectid = '$projectid' 
order by projects_comments.commentid desc 
+0

Merci Tony, j'ai eu votre requête à travailler, mais je devais utiliser une 'jointure gauche' plutôt que la jointure externe devait également 'et' une partie de la nouvelle jointure pour vérifier $ userid plutôt que projets_comments.userid. À l'aide de la jointure externe, elle renvoie des résultats NULL. Peu importe, cela résout mon problème si énorme merci! – gordyr

+0

Toutes mes excuses pour avoir remarqué Joachim avec la bonne réponse Tony. Sa requête a fonctionné dès la sortie de la boîte mais la vôtre a nécessité quelques modifications. J'espère que tu comprends. Merci pour l'aide en tout cas. :) – gordyr

+0

Correct est correct. Guy semble en savoir un peu plus que moi, jamais vu l'as n'est pas nul dans une clause Select. Donc, votre question m'a appris quelque chose aussi. –

Questions connexes