Поведение, которое вы описываете, - это то, что должно делать соединение. Если вам нужна только 1 запись для каждой записи в блоге, вам нужно использовать группирование по. Чтобы получить список всех записей блогов с количеством комментариев, вы можете сделать запрос, например:
SELECT blogs.*,Count(comments.comment_ID)
FROM blogs
LEFT JOIN comments
ON blogs.blog_id=comments.blog_id WHERE blogs.blog_id = $active
ORDER BY comments.comment_id
GROUP By Blog.BlogID
Однако вы сказали, что хотите отобразить только блог, а затем комментарии, связанные с этим блогом. В этом случае вы, скорее всего, просто используете начальный запрос для извлечения всех блогов, а затем другой запрос, когда вы просматриваете все записи блога, чтобы получить комментарии для каждого блога. Вот какой-то псевдокод.
select * FROM blogs
For each record from above
Code for displaying blog goes here
Select * FROM Comments where Blog_id = $blogID
For each comment from above query
code for displaying comment goes here
Next COmment
Next Blog
Вы могли бы просто сделать один выбор для всех комментариев, который был бы более эффективным, но делает полученный код более сложным, так как вам нужно найти записи с использованием php в результирующем списке. Гораздо проще просто использовать несколько запросов, и для большинства блогов (максимум 10 статей на странице) это не будет иметь большого значения. Если вы действительно хотите использовать один запрос, вы можете структурировать свою программу, как показано в псевдокоде ниже.
SELECT * FROM blogs
LEFT JOIN comments ON blogs.blog_id=comments.blog_id
WHERE blogs.blog_id = $active ORDER BY blogs.blog_id, comments.comment_id
$LastBlogID = -1
FOR EACH Record
If $LastBlogID != record['blog_id']
Display Blog Information
$LastBlogID = record['blog_id']
End If
Display Comment Information
Next Record