Подсчет и объединение двух таблиц - PullRequest
0 голосов
/ 23 апреля 2010

Eventhosts - содержит три обычных хоста и поле «прочее» (если кто-то их заменяет) или отредактируйте: будучи гостевым хостом (в дополнение к постоянным пользователям)

eventid | host (SET[Steve,Tim,Brian,other])
-------------------------------------------
      1 | Steve
      2 | Tim
      3 | Brian
      4 | Brian
      5 | other
      6 | other

Событие

id | other | name etc.
----------------------
1  |       | …
2  |       | …
3  |       | …
4  | Billy | …
5  | Billy | …
6  | Irwin | …

Этот запрос:

SELECT h.host, COUNT(*) AS hostcount
FROM host AS h
LEFT OUTER JOIN event AS e ON h.eventid = e.id
GROUP BY h.host

Возвращает:

Steve | 1
Tim   | 1
Brian | 2
other | 2

Я хочу вернуть:

Steve | 1
Tim   | 1
Brian | 2
Billy | 1
Irwin | 1
* * ИЛИ тысячу двадцать-один:
Steve |       | 1
Tim   |       | 1
Brian |       | 2
other | Billy | 1
other | Irwin | 1

А не :

Steve |       | 1
Tim   |       | 1
Brian |       | 1
Brian | Billy | 1
other | Billy | 1
other | Irwin | 1

Может кто-нибудь сказать мне, как я могу достичь этого или указать мне направление?

Ответы [ 3 ]

1 голос
/ 23 апреля 2010
SELECT eh.host, e.other, count(*)
FROM Eventhosts eh
LEFT JOIN Event e ON (eh.eventid = e.id)
GROUP BY eh.host, e.other

возвращает

Steve |       | 1
Tim   |       | 1
Brian |       | 1
other | Billy | 1
other | Irwin | 1
1 голос
/ 23 апреля 2010

Используйте это:

SELECT IF(h.host != 'other', h.host, e.other) as the_host, COUNT(e.*) AS hostcount
FROM host h
LEFT JOIN event e ON h.eventid = e.id
GROUP BY the_host

Просто заметка, не используйте COUNT(*), если у хоста нет события, он будет показывать 1 вместо 0. Используйте COUNT(e.*)

Для последнего результата используйте это:

SELECT h.host, e.other, COUNT(e.*) AS hostcount
FROM host h
LEFT JOIN event e ON h.eventid = e.id
GROUP BY IF(h.host != 'other', h.host, e.other),
   h.host, e.other -- try repeating it here

[EDIT]

Попробовал следующий запрос (т. Е. Без предложенного повторения полей в GROUPBY), он также работает на ваш оригинальный вопрос и ваш отредактированный вопрос.Я только что установил MySQL сейчас, я не знаю, имеет ли он отношение к типу базы данных, я только включил InnoDB и строгие настройки.Кстати, COUNT(e.*) (который, как я полагаю, принят ANSI SQL) не работает на MySQL, вместо этого необходимо использовать COUNT(e.id) (или, возможно, вы уже исправили свой запрос):

SELECT h.host, e.other, COUNT(e.id) AS hostcount
FROM host h
LEFT JOIN event e ON h.eventid = e.id
GROUP BY IF(h.host != 'other', h.host, e.other)
   -- note: i removed the suggested repeating of fields here, it works on my box here.     
   -- Settings: InnoDB and strict mode
1 голос
/ 23 апреля 2010

Просто удалите GROUP BY (поскольку вы не хотите, чтобы он свернул значения для этого столбца) и добавьте столбец event.other в список столбцов.

SELECT h.host, e.other, COUNT(*) AS hostcount
    FROM host AS h
    LEFT OUTER JOIN event AS e ON h.eventid = e.id

Я только что вспомнил, что вы можете достичьпервое решение также:

SELECT IF(h.host = 'other', e.other, h.host) AS host, COUNT(*) AS hostcount
    FROM host AS h
    LEFT OUTER JOIN event AS e ON h.eventid = e.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...