2010-01-10 3 views
0

J'ai 2 tables. Une table contient des messages et l'autre contient des votes pour les messages. Chaque membre peut voter (+ ou -) pour chaque message. (Exemple de structure :)Comment combiner les données de 2 tables dans des circonstances?

  • Posts posts: pid, appartient, userp, text.
  • Tableau des voix: vid, userv, postid, vote.

Également une table qui contient les informations pour les utilisateurs.

Ce que je veux est: En supposant que je suis un membre connecté. Je veux montrer tous les messages, et à ceux que j'ai déjà voté, ne pas me laisser voter à nouveau. (Et me montrer ce que j'ai voté + ou -)

Ce que je l'ai fait jusqu'à maintenant est très mauvais car il va faire beaucoup de requêtes:

SELECT `posts`.*, `users`.`username` 
FROM `posts`,`users` 
WHERE `posts`.belongs=$taken_from_url AND `users`.`usernumber`=`posts`.`userp` 
ORDER BY `posts`.`pid` DESC; 

puis:

foreach ($query as $result) {if (logged_in) {select vote from votes....etc} } 

Donc, cela signifie que si je suis connecté et qu'il affiche 30 messages, il fera 30 requêtes pour vérifier si à chaque poste j'ai voté et ce que j'ai voté. Ma question est, puis-je le faire plus court avec un JOIN (je suppose) et comment? (J'ai déjà essayé quelque chose, mais je n'ai pas réussi)

Répondre

0

Tout d'abord, je dirai que si vous avez des sorties significativement différentes pour les utilisateurs connectés par rapport à ceux qui ne le sont pas, il suffit d'avoir deux requêtes plutôt que d'essayer pour créer quelque chose de vraiment compliqué.

En second lieu, cela devrait faire quelque chose comme ce que vous voulez:

SELECT p.*, u.username, 
    (SELECT SUM(vote) FROM votes WHERE postid = p.pid) total_votes, 
    (SELECT vote FROM votes WHERE postid = p.pid AND userv = $logged_in_user_id) my_vote 
FROM posts p 
JOIN users u ON p.userp = u.usernumber 
WHERE p.belongs = $taken_from_url 
ORDER BY p.pid DESC 

Note: Vous ne dites pas ce que les valeurs de la table votes sont. Je suppose que c'est soit +1 (haut) ou -1 (bas) afin que vous puissiez facilement trouver le total des votes en les additionnant. Si vous ne le faites pas de cette façon, je vous suggère de le faire pour vous faciliter la vie.

La première sous-requête corrélée peut être éliminée en faisant JOIN et GROUP BY mais j'ai tendance à trouver la forme ci-dessus beaucoup plus lisible.

Donc, ce que cela fait, c'est qu'il rejoint les utilisateurs à des messages, un peu comme vous le faisiez, sauf qu'il utilise la syntaxe JOIN (ce qui revient à la lisibilité). Ensuite, il a deux sous-requêtes: le premier trouve le total des votes pour ce poste particulier et le second découvre le vote d'un utilisateur particulier:

  • +1: up vote;
  • -1: vote négatif;
  • NULL: pas de vote.
+0

salut, merci de répondre. Oui, pour les visiteurs (non connectés) il y aurait une autre requête (plus facile). Pour les membres, s'ils ont voté +1, ils stockent à la base de données le mot: "plus", sinon le mot "moins". Pour ces membres qui n'ont pas voté, alors il ne stocke rien (donc il y aura le lien pour voter). Je vais essayer le code et je vais dire si je trouve un problème. Merci beaucoup! :) – Nick

Questions connexes