MySQL Sonucu - "Group By"

2 Cevap php

Im sahip sorunu açıklamak için elimden geleni yapacağım :)

Benim forumda her konu / başlık bir disk temsil eder. Forumun kayıtlı üyeler kendi koleksiyonunda olması her diski kene için onay kutularını bir dizi (sonraki her diske görüntülenen bir) kullanın. Form $ _POST'ed zaman bu kadar benzer bir tabloda bilgileri saklar:

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

Kullanıcı sonraki forum hit zaman işaretli ve kullanıcının sahip diskler üzerinde özürlü onay kutularını var. Bu kullanılarak yapılır:

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

Yukarıdaki kapmak Sonra aşağıdaki (soyunmuş) kodunu kullanarak görüntülemek diskler, bütün:

$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)) { // 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']) { $read = '
I own this!'; } else { $read = '
I own this!'; } } }

İkinci bir kullanıcı kendi koleksiyonuna, örneğin aynı disk kimliğini ekler kadar bu harika çalışıyor:

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

Bu forumda görünmesi için bir yinelenen konu neden olur. Bir doğru böyle bir konu id ve görüntü olarak aynı bilgileri paylaşıyor olsa da, diğer işaretli değil (bunu kendi çünkü) işaretli olduğundan.

Ancak, yanlış bir kaldırıyor - Benim ilk düşünce başarıyla yinelenen konuyu kaldırmaz SQL, için c.disc_id BY eklemeyi GROUP çalışmaktı. Ben işaretlediyseniz disk artık sadece unticked sürümünü bırakarak gösterilmiştir.

Hope that makes sense. Can anyone offer any insight or ideas? Many Thanks.

2 Cevap

Ben senin şema bilmiyorum çünkü bu bir tahmin olduğunu, ancak ben size WHERE yan kullanıcının kimliğini belirterek görmüyorum.

Ne bir şey hakkında like aşağıdakiler?

  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;

Ayrıca, Konu ID = Disk kimliği katılmadan ediyoruz. Bu kasıtlı mı?

Ben bu çözümü için iki easy şekilde görebilirsiniz:

İlk:

İki sorgu ile, grup sorgu ve ikinci bir kullanıcının sahip olduğu tüm disc_id getirmesi

ikinci:

İlk sorgu ile:

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