MySQL Join возвращает слишком много строк - PullRequest
2 голосов
/ 06 октября 2011

Я относительно новичок в MySQL, и я озадачен этим разделом.

Я создаю простую страницу блога, которая будет отображать блог вместе с комментариями, связанными с ним. В настоящее время у меня есть две таблицы для обработки этих данных:

Блоги

.blog_id (primary), .blog_title, .blog_date, .blog_post

Комментарии

.comment_id (primary), .blog_id, .comment_name, .comment

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

SELECT * FROM blogs JOIN comments ON blogs.blog_id=comments.blog_id WHERE blogs.blog_id = $active ORDER BY comments.comment_id

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

Надеюсь, я объяснил это ясно. Любая помощь будет фантастической. Спасибо.

Ответы [ 3 ]

3 голосов
/ 06 октября 2011

Поведение, которое вы описываете, - это то, что должно делать соединение. Если вам нужна только 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
0 голосов
/ 06 октября 2011

Есть два раздела, которые вам нужно изучить, один - ваш запрос, а другой - как вы отображаете вещи.

Я только что нашел какой-то простой инструмент для построения запроса MYSQL и анализа запроса., вы даже можете связать свою базу данных с веб-сайтом.

Вы можете искать в Google Chrome Market или перейти по ссылке ниже.

Я просто даю предложение и направление, а не на самом деле решить его.

Конструктор запросов MYSQL

0 голосов
/ 06 октября 2011

Есть два способа приблизиться к этому:

Если вам абсолютно необходимо сделать это в одном запросе, используйте объединенный SQL и переберите результаты, используя идентификатор блога в качестве уникального ключа:

$blogId = 0;
while ( null != ($row = mysql_fetch_assoc( $result ) ) )
{
  if ( $row['blog_id'] != $blogId )
  {
     // Display blog contents here
     $blogId = $row['blog_id'];
  }
  // Print coment
}

Более эффективный способ - выполнить это как два запроса. Сначала выберите информацию блога с количеством постов:

SELECT blog_id, blog_title, blog_date, blog_post, COUNT(*) as comment_count
FROM blogs INNER JOIN comments ON blogs.blog_id = comments.blog_id
WHERE blog_id = $blogId
GROUP BY blog_id, blog_title, blog_date, blog_post;

или, используя дополнительный выбор:

SELECT blog_id, blog_title, blog_date,
    (SELECT COUNT(*) FROM comments WHERE blog_id = blog.blog_id) as comment_count
FROM blogs
WHERE blog_id = $blogId
  • Только если comment_count больше нуля, выберите комментарии отдельно и отобразите.

Не говоря уже о том, что существуют различные виды просмотров блогов; на индексной странице второй запрос - это все, что вам нужно для получения сводки блога и количества комментариев к каждому сообщению, без необходимости отображать содержимое каждого комментария.

...