2010-03-01 2 views
0

Постараюсь описать проблему Im having :)Результат MySQL - «Группировать по» удаляет неправильные дубликаты

Каждая тема/тема на моем форуме представляет один диск. Зарегистрированные участники форума используют ряд флажков (один отображается рядом с каждым диском), чтобы отметить каждый диск, который у них есть в их коллекции. Когда форма $ _POST'ed, она хранит информацию в таблице следующим образом:

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

Когда пользователь просматривает форум, у меня есть флажки, отмеченные и отключенные на дисках, которыми владеет пользователь. Это делается с помощью:

$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; 

Вышеуказанных грейферов всех дисков, которые я затем отобразить с помощью следующего (усеченного) кода:

$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)) 
{ 

в то время как ($ cur_topic = $ db-> FETCH_ASSOC ($ result)) { // Если идентификатор пользователя совпадает с текущими дисками user_id (т.е. если этот пользователь владеет этим диском) if ($ cur_topic ['user_id'] == $ pun_user ['id']) { $ read = '
У меня есть это!'; } else { $ read = '
У меня есть это!'; }} }

Это прекрасно работает, пока второй пользователь добавляет тот же идентификатор диска к его коллекции, например:

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

Это приводит к появлению дублирующего потока на форуме. Один из них правильно отмечен (потому что я его владею), другой не отмечен галочкой, хотя он имеет общую информацию, такую ​​как идентификатор темы и изображение.

Моя первая мысль состояла в том, чтобы попробовать добавить GROUP BY c.disc_id в SQL, который успешно удаляет повторяющийся раздел - однако он удаляет неправильный. Диск, который я отмечен, больше не отображается, оставив только немаркированную версию.

Надеюсь, что имеет смысл. Может ли кто-нибудь предложить какие-либо идеи или идеи? Большое спасибо.

ответ

0

Это предположение, поскольку я не знаю вашу схему, но я не вижу, чтобы вы указали идентификатор пользователя в своем предложении WHERE.

Что относительно чего-то как следующее?

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; 

Кроме того, вы присоединяетесь к ID темы = ID диска. Это намеренно?

+0

в его запросе нет '$ user_id', потому что он хочет получить все потоки, а не тот, который принадлежит пользователю. – Mathieu

0

Я вижу два легко пути для решения этого:

первый:

с два запросом, то группа запросы и второе, чтобы принести все disc_ID принадлежащий пользователю

второго :

с первым запросом:

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!'; 
    } 
    } 
}