Как сгруппировать пустое поле - PullRequest
0 голосов
/ 05 октября 2011

После этого запроса:

SELECT forum_categories.id AS category_id, forum_categories.title, forum_topics.id AS topic_id, forum_topics.title, user
FROM forum_categories JOIN forum_topics ON forum_categories.id=forum_topics.category_id
LEFT OUTER JOIN forum_views ON forum_topics.id=forum_views.topic_id
WHERE forum_categories.id=6
ORDER BY forum_categories.id

Я получил такие результаты:

enter image description here

Теперь я хотел бы:

  • добавить еще одно поле в выборку, которое называется thereIsANull
  • сгруппировать все мои результаты по полю пользователь category_id
  • установка thereIsANull в 1, если в поле пользователя (во время группировки) нет значения NULL, в противном случае - 0.

Так в примере нижерезультат должен быть 1 строка:

6    Welcome    (some topic_id)     (some title)   (djfonplaz or null)   0

и, если все пользователи отличались от NULL:

6    Welcome    (some topic_id)     (some title)   (djfonplaz)   1

Как я могу это сделать на MySql?

Ответы [ 3 ]

4 голосов
/ 05 октября 2011
SELECT 
  forum_categories.id AS category_ids
  , forum_categories.title as titles
  , forum_topics.id AS topic_ids
  , forum_topics.title as topic_titles
  , count(*) as NumberOfRows
  , GROUP_CONCAT(IFNULL(user,'(no user)')) AS users 
  , (count(*) - count(user)) as IsThereANull  
FROM forum_categories 
INNER JOIN forum_topics ON forum_categories.id=forum_topics.category_id
LEFT OUTER JOIN forum_views ON forum_topics.id=forum_views.topic_id
WHERE forum_categories.id=6
GROUP BY category_id
ORDER BY forum_categories.id

IsThereANull будет 0, если нет нуля и 1 или больше, если есть.

1 голос
/ 05 октября 2011

Я думаю, что-то вроде этого будет работать так, как вы хотите:

SELECT cat.id AS category_id, 
       cat.title, 
       top.id AS topic_id, 
       top.title, 
       user,
       (
           (
               SELECT COUNT(*) FROM forum_categories 
               WHERE id = cat.id AND user IS NULL
           ) > 0 -- This is to check wether if any NULL is found
       ) as thereIsANull 
FROM forum_categories as cat
JOIN forum_topics as top ON cat.id = top.category_id
LEFT OUTER JOIN forum_views as view ON top.id = view.topic_id
WHERE cat.id = 6 -- You can ofcourse change this to whatever variable your using
GROUP BY cat.id -- Just an ordinary group by category id
ORDER BY cat.id

Предполагая, что полевой пользователь найден в таблице forum_categories, в противном случае просто измените подзапрос, чтобы присоединиться к той таблице, где вы получаете пользователяиз

Обратите внимание, что Thiis в основном совпадает с тем, что написал Cez , поэтому он заслуживает некоторых кредитов, единственное отличие - это подзапрос и группировка по идентификатору категории вместо пользователя.

Попробуйте и дайте мне знать, если это было правильно:)

1 голос
/ 05 октября 2011

Я думаю, что следующий запрос должен получить результат, который вы ищете:

SELECT forum_categories.id AS category_id, forum_categories.title, 
       forum_topics.id AS topic_id, forum_topics.title, user, 
       (
          SELECT MAX(IF(COUNT(*), 0, 1))
          FROM forum_categories JOIN forum_topics ON 
               forum_categories.id=forum_topics.category_id
          LEFT OUTER JOIN forum_views ON forum_topics.id=forum_views.topic_id
          WHERE forum_categories.id=6 AND user IS NULL
    ) AS thereIsANull
FROM forum_categories JOIN forum_topics ON forum_categories.id=forum_topics.category_id
LEFT OUTER JOIN forum_views ON forum_topics.id=forum_views.topic_id
WHERE forum_categories.id=6 AND user IS NOT NULL
GROUP BY user
ORDER BY forum_categories.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...