Как можно смешать столбцы COUNT () и не-COUNT (), не теряя информацию в запросе? - PullRequest
1 голос
/ 13 января 2009

Я начал с запроса:

SELECT strip.name as strip, character.name as character
  from strips, characters, appearances
 where strips.id = appearances.strip_id
   and characters.id = appearances.character.id
   and appearances.date in (...)

Что дало мне некоторые результаты:

strip                 | character
'Calvin & Hobbes'     | 'Calvin'
'Calvin & Hobbes'     | 'Hobbes'
'Pearls Before Swine' | 'Pig'
'Pearls Before Swine' | 'Rat'
'Pearls Before Swine' | 'Hobbes'  # a guest appearance
'Pearls Before Swine' | 'Calvin'  # a guest appearance

Затем я хотел бы также получить COUNT количества раз, которое символ используется (в любой полосе) в наборе результатов. Итак, я попробовал:

SELECT count(character.id), strip.name as strip, character.name as character
  from strips, characters, appearances
 where strips.id = appearances.strip_id
   and characters.id = appearances.character.id
   and appearances.date in (...)

Но это дало мне

[ERROR 11:20:17] Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

Итак, я попробовал:

SELECT count(character.id), strip.name as strip, character.name as character
  from strips, characters, appearances
 where strips.id = appearances.strip_id
   and characters.id = appearances.character.id
   and appearances.date in (...)
 group by character.id

Что дало мне

count | strip                 | character
4     | 'Calvin & Hobbes'     | 'Calvin'
4     | 'Calvin & Hobbes'     | 'Hobbes'
2     | 'Pearls Before Swine' | 'Pig'
2     | 'Pearls Before Swine' | 'Rat'

То есть я теряю всю дополнительную информацию о том, какие именно символы появляются в каких полосах.

Что бы я хотел получить, это:

count | strip                 | character
4     | 'Calvin & Hobbes'     | 'Calvin'
4     | 'Calvin & Hobbes'     | 'Hobbes'
2     | 'Pearls Before Swine' | 'Pig'
2     | 'Pearls Before Swine' | 'Rat'
4     | 'Pearls Before Swine' | 'Calvin'
4     | 'Pearls Before Swine' | 'Hobbes'

Но я не могу понять это. Я на MySQL, если это имеет значение. Возможно, это займет всего два запроса.

Ответы [ 6 ]

3 голосов
/ 13 января 2009

Поддерживает ли mySQL аналитические функции? Как:

SELECT foo.bar, baz.yoo, count(baz.yoo) over (partition by foo.bar) as yoo_count 
from foo, bar
where foo.baz_id = baz.id and baz.id in (...)

В качестве альтернативы:

SELECT foo.bar, baz.yoo, v.yoo_count 
from foo, bar, 
( select foo.baz_id, count(*) as yoo_count
  from foo
  group by foo.baz_id
) as v
where foo.baz_id = baz.id and baz.id in (...)
and v.baz_id = foo.baz_id;
1 голос
/ 13 января 2009

Как насчет группировки по foo.bar?

SELECT count(baz.id) as count, foo.bar, baz.yoo where foo.baz_id = baz.id and baz.id in (...) group by foo.bar
0 голосов
/ 13 января 2009

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

0 голосов
/ 13 января 2009

подвыборка:

SELECT foo.bar
    ,baz.yoo
    ,(SELECT COUNT(*) FROM baz AS baz2 WHERE baz2.yoo = baz.yoo etc.) AS yoo_count
FROM foo, baz
WHERE foo.baz_id = baz.id
    AND baz.id in (...)

Вы также можете взять вложенный выбор, вложить его и присоединиться.

0 голосов
/ 13 января 2009

Если MySQL поддерживает функции Google Analytics / Window, то:

select bar, yoo,
    count(yoo) over (partition by yoo) c 
from t
/

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

select bar, yoo,
    (select count(yoo) from t t2 where t2.yoo=t.yoo) c 
from t
/

на оракуле, тестовые данные выглядят так:

create table t(bar number, yoo varchar2(16));

insert into t(bar, yoo) values (1, 'hello');

insert into t(bar, yoo) values (2, 'goodbye');

insert into t(bar, yoo) values (3, 'goodbye');

insert into t(bar, yoo) values (4, 'goodbye');

insert into t(bar, yoo) values (2, 'calvin');

insert into t(bar, yoo) values (5, 'Hobbes');

insert into t(bar, yoo) values (6, 'Hobbes');

commit;
0 голосов
/ 13 января 2009

В системе RDBMS я выбираю запрос подсчета во временную таблицу, а затем снова присоединяю временную таблицу к основной таблице. Это даст вам лучшее из обоих миров.

Я не знаю, поддерживает ли mySQL временные таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...