2010-03-01 5 views
0

Je ferai de mon mieux pour décrire le problème que j'ai avec :)Résultat MySQL - "Grouper par" en supprimant les doublons incorrects

Chaque fil/sujet dans mon forum représente un disque. Les membres enregistrés du forum utilisent une série de cases à cocher (une affichée à côté de chaque disque) pour cocher chaque disque qu'ils ont dans leur collection. Lorsque le formulaire est $ _POST'ed, il stocke les informations dans une table comme suit:

| user_id - disc_id |
+ -------------------- +
| 2 - 571 |
| 2 - 603 |
| 2 - 4532 | Lorsque l'utilisateur regarde le forum, les cases à cocher sont cochées et désactivées sur les disques que l'utilisateur possède. Cela se fait à l'aide:

$sql = 'SELECT id, poster, subject, posted, last_post, last_post_id, 
last_poster, num_views, num_replies, closed, sticky, moved_to, topicimage, 
c.user_id, c.disc_id FROM topics LEFT JOIN collections AS c ON c.disc_id=id 
WHERE forum_id='.$id.' ORDER BY sticky DESC; 

Les pinces au-dessus de tous les disques que je puis afficher en utilisant les éléments suivants (stripped down) Code:

$result = $db->query($sql) or error('Unable to fetch topic list '.$sql.'', __FILE__, __LINE__, $db->error()); 

// If there are topics in this forum 
if ($db->num_rows($result)) 
{ 

while ($ cur_topic = $ db-> fetch_assoc ($ result)) { // Si connecté, l'ID des utilisateurs correspond aux disques actuels user_id (c'est-à-dire si cet utilisateur est propriétaire de ce disque) if ($ cur_topic ['user_id'] == $ pun_user ['id']) { $ read = '
Je possède ce!'; } else { $ read = '
Je possède ce!'; }} }

Cela fonctionne très bien, jusqu'à ce qu'un second utilisateur ajoute le même ID du disque à sa collection, par exemple:

| user_id - disc_id |
+ -------------------- +
| 2 - 571 |
| 2 - 603 |
| 6 - 571 |

Cela entraîne l'apparition d'un thread dupliqué dans le forum. L'un est coché correctement (parce que je le possède), l'autre n'est pas coché, bien qu'il partage toutes les mêmes informations telles que l'identifiant du sujet et l'image.

Mon premier réflexe était d'essayer d'ajouter GROUP BY c.disc_id au SQL, ce qui supprime avec succès le sujet en double - Cependant, il supprime le mauvais. Le disque que j'ai coché n'est plus affiché, ne laissant que la version décochée.

Espérons que cela a du sens. Quelqu'un peut-il offrir des idées ou des idées? Merci beaucoup.

Répondre

0

Ceci est une supposition, car je ne connais pas votre schéma, mais je ne vous vois pas en spécifiant l'ID de l'utilisateur dans votre clause WHERE.

Qu'en est-il quelque chose comme le suivant?

SELECT t.id, t.poster, t.subject, t.posted, t.last_post, t.last_post_id, 
     t.last_poster, t.num_views, t.num_replies, t.closed, t.sticky, 
     t.moved_to, t.topicimage, c.user_id, c.disc_id 
    FROM topics AS t LEFT JOIN collections AS c ON c.disc_id = t.id 
    WHERE forum_id = '.$id.' 
    AND c.user_id = '.$user_id.' 
ORDER BY t.sticky DESC; 

De plus, vous vous joignez à ID du sujet = ID du disque. Est-ce intentionnel?

+0

il n'y a pas de $ user_id dans sa requête, car il veut récupérer tous les threads, mais pas celui que l'utilisateur possède. – Mathieu

0

Je peux voir deux facile moyen pour résoudre ce:

premier:

avec deux requêtes, vous requête de groupe et une seconde pour aller chercher tous les disc_id appartenant à l'utilisateur

seconde :

avec votre première requête:

if ($db->num_rows($result)) { 
    $array = Array(); 
    while ($cur_topic = $db->fetch_assoc($result)) { 
    $id = $cur_topic['disc_id']; 
    if (!array_key_exists ($id, $array)) { // allow only result per disc_id 
     $array[$id] = $cur_topic; 
     $array[$id]['owned'] = false; 
    } 
    // If logged in users ID matches the current discs user_id (i.e if this user owns this disc) 
    if ($cur_topic['user_id']==$pun_user['id']) // check if one is owned by the user 
     $array['owned'] = true; 
    } 
    foreach ($array as $cur_topic) { 
    if ($cur_topic['owned']) { 
     $read = '<br /><input type="checkbox" disabled="disabled" checked="checked" /> <span style="color:#999">I own this!</span>'; 
    } else { 
     $read = '<br /><input type="checkbox" name="discs[]" value="'.$cur_topic['id'].'" /> I own this!'; 
    } 
    } 
}