ПРИСОЕДИНИТЬСЯ; только одна запись, пожалуйста! - PullRequest
0 голосов
/ 16 февраля 2010

ОК, у меня сложный запрос из плохо спроектированной БД ... В одном запросе мне нужно получить счетчик из одной базы данных, информацию из другой со ссылкой из другой, вот так:

Каждый блог имеет тип (новости, отчеты и т. Д.) И идентификатор раздела для определенной части сайта, но он также может быть связан с несколькими компьютерными играми и разделами)

тип (blog_id, title, body и т. Д.) // да, я знаю, что тип - это имя блога, а не просто номер идентификатора в таблице, а не мой дизайн

blog_link (blog_id, blog_type, section_id, game_id)

blog_comments (blog_id, blog_type, comment и т. Д.) *

Итак, запрос выглядит примерно так:

SELECT bl.`blog_id`, count(bc.`blog_id`) AS 'comment_count', t.`added`
FROM blog_link bl
JOIN type t ON t.`id` = bl.`blog_id`
JOIN blog_comments bc ON (`item_id` = bl.`blog_id` AND `blog_type` = '[$type]')
WHERE bl.`section_id` = [$section_id] AND bl.`blog_type` = '[$type]'
GROUP BY bl.`blog_id`
ORDER BY `added` DESC
LIMIT 0,20

Теперь это нормально, если у меня нет нескольких игр, связанных с одним блогом.

Редактировать: Таким образом, в настоящее время, если связано более чем одна игра, поле comment_count умножается на количество связанных игр ... не хорошо.

Я понятия не имею, как я мог это сделать ... Это просто не работает! Если бы я мог каким-то образом сгруппироваться по blog_id, прежде чем присоединиться, это было бы золото ... у кого-нибудь есть идея?

Большое спасибо заранее

  • Dorjan

edit2: Я предложил щедрость, поскольку эту проблему, безусловно, можно решить !! Давай, ребята!

Ответы [ 3 ]

1 голос
/ 18 февраля 2010

Кажется, вы просто хотите получить счетчик DISTINCT, поэтому просто добавьте DISTINCT в счетчик. Хотя вам нужно будет добавить какой-то уникальный идентификатор для каждого комментария. В идеале у вас должен быть уникальный идентификатор (т. Е. Автоинкремент) для каждого комментария, но если вы этого не сделаете, вы можете использовать blog_id + author + timestamp.

SELECT bl.`blog_id`, count(DISTINCT CONCANT(bc.`blog_id`,bc.`author`,bc.`timestamp`) AS 'comment_count',...

Это должно дать вам уникальный счетчик комментариев.

0 голосов
/ 18 февраля 2010

Я думаю, вам нужно сначала получить блоги типа "X", а затем подсчитать количество комментариев к этим блогам.

SELECT 
EXPR1.blog_id, 
count(bc.`blog_id`) AS 'comment_count'

FROM ( ВЫБРАТЬ бл. blog_id, т. added ОТ blog_link bl ПРИСОЕДИНИТЬСЯ наберите t ON t. id = bl. blog_id

WHERE 
    bl.`section_id` = [$section_id] 
    AND 
    bl.`blog_type` = '[$type]'
GROUP BY 
    bl.`blog_id`
ORDER BY 
    `added` DESC
LIMIT 0,20

) AS EXPR1 ПРИСОЕДИНИТЬСЯ blog_comments bc ON ( до н.э. item_id = EXPR1. blog_id )

0 голосов
/ 18 февраля 2010

Не тестировалось:

SELECT bl.`blog_id`, count(bc.`blog_id`) AS 'comment_count', t.`added`
FROM
(
  SELECT DISTINCT blog_id, blog_type 
  FROM blog_link
  WHERE
   `section_id` = [$section_id] 
   AND `blog_type` = '[$type]'
) bl
INNER JOIN blog_comments bc ON (
    bc.`item_id` = bl.`blog_id` AND bc.`blog_type` = bl.`blog_type`
)
INNER JOIN type t ON t.`id` = bl.`blog_id`
GROUP BY bl.`blog_id`
ORDER BY t.`added` DESC
LIMIT 0,20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...