Страница 1 из 1

Group by и тип text

Добавлено: 2009-11-03 19:57:20
vuzya
Здравствуйте. Внитри одной процедуры имеется следующий запрос:

Код: Выделить всё

SELECT        Posts.PostId, Users.UserName, ..., COUNT(User_Posts.PostId) AS NumberOfPosts, Posts.Text
	FROM            Posts INNER JOIN
	                         Users ON Posts.AuthorId = Users.UserId INNER JOIN
	                         Posts AS User_Posts ON Users.UserId = Posts.AuthorId 
	WHERE        (Posts.TopicId = @TopicId)
	GROUP BY Posts.PostId, Users.UserName, ...
	ORDER BY ...
Вместо неважных деталей я поставил "..." . Проблема в следующем: поскольку я считаю посты, мне нужно чтобы все выбраные столбцы имелись в GROUP BY, но если я пытаюсь поместить туда Posts.Text(столбец типа text), то получаю ошибку что тип text не может быть сравнен(а следовательно и группировать по нему нельзя).
Подскажите пожалуйста как лудше всего выити с этого положения.
P.S. поскольку я очень начинающий, то запросы у меня бывают хорошие и разные. Больше конечно разных. Поэтому предупредите пожалуйста, если запросы такого типа лудше вообще не использовать, и подскажите чем лудше заменить.

Re: Group by и тип text

Добавлено: 2009-11-03 20:09:18
zg
vuzya писал(а):и подскажите чем лудше заменить.
гм.. может всё-таки лучше? :smile:
vuzya писал(а):мне нужно чтобы все выбраные столбцы имелись в GROUP BY
зачем? в этом нет смысла

Re: Group by и тип text

Добавлено: 2009-11-03 20:38:42
vuzya
zg писал(а):vuzya писал(а):мне нужно чтобы все выбраные столбцы имелись в GROUP BY зачем? в этом нет смысла
Так мне пишет в сообщении об ошибке, если я этого не сделаю. Что-то в духе "столбец недопустим так как не содержится ни в статических функциях, ни в списке GROUP BY"

Re: Group by и тип text

Добавлено: 2009-11-03 20:42:36
Gamerman
Потомучто при группировке нужно использовать агрегатные функции к столбцам, которые не описаны в части group by.

Re: Group by и тип text

Добавлено: 2009-11-03 21:11:22
vuzya
Ну я же немогу никакую агрегирующую функцию применить к полю типа text... И в group by, тоже немогу.

Re: Group by и тип text

Добавлено: 2009-11-03 21:15:31
Gamerman
vuzya писал(а):Ну я же немогу никакую агрегирующую функцию применить к полю типа text... И в group by, тоже немогу.
А что же за запрос ты хочешь тогда получить? Если группируешь, то какой же результат должен быть, если в разных строчках поле текст будет разным?

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

Re: Group by и тип text

Добавлено: 2009-11-03 21:57:27
zg
vuzya писал(а):Ну я же немогу никакую агрегирующую функцию применить к полю типа text... И в group by, тоже немогу.
то, что ты хочешь сделать одним запросом (и, видимо, ловко сэкономить), делается через временную таблицу

Re: Group by и тип text

Добавлено: 2009-11-03 22:14:46
vuzya
2Gamerman: Мне НУЖНО групировать по Posts.Text(имеет тип text), но компилятор сторед процедур непозволяет так как столбец типа text не может быть групирован. Значения типа text даже сравнивать нисчем кроме NULL нельзя. А применить агрегирующую функцию я немогу "по смыслу" - желательный результат требует групированый Posts.Text.

2 zg: Посоветовали решить следующим образом:

Код: Выделить всё

SELECT        aaa.PostId, aaa.UserName, ..., 
aaa.NumberOfPosts, Posts.TEXT
        FROM (
SELECT        Posts.PostId, Users.UserName, ..., 
COUNT(User_Posts.PostId) AS NumberOfPosts --, Posts.Text
        FROM            Posts INNER JOIN
                                 Users ON Posts.AuthorId = Users.UserId INNER JOIN
                                 Posts AS User_Posts ON Users.UserId = Posts.AuthorId 
        WHERE        (Posts.TopicId = @TopicId)
        GROUP BY Posts.PostId, Users.UserName, ...
        ORDER BY ...) AS aaa
INNER join Posts ON Posts.PostId=aaa.PostId
Будет ли это рациональнее чем выносить "внутринний" селект в временную таблицу?

Re: Group by и тип text

Добавлено: 2009-11-03 22:16:18
Gamerman
А что в Posts.Text хранится?

Re: Group by и тип text

Добавлено: 2009-11-03 22:42:47
vuzya
Текст сообщения на форуме

Re: Group by и тип text

Добавлено: 2009-11-03 22:43:39
zg
vuzya писал(а):2 zg: Посоветовали решить следующим образом:
-))) не от великого ума посоветовали. Подзапрос - таже самая временная таблица, только гораздо хуже в плане производительности и сильно усложняет понимание запроса.

Re: Group by и тип text

Добавлено: 2009-11-03 22:52:41
Gamerman
vuzya писал(а):Текст сообщения на форуме
Тогда он практически не повторяется, какой смысл в его группировке?

А можете на пальцах объяснить, что есть и чего вы хотите сделать запросом?

Re: Group by и тип text

Добавлено: 2009-11-03 23:47:11
vuzya
В его группировке нет смысла, но поскольку мне нужно посчитать COUNT(User_Posts.PostId) (число сообщений для каждого юзера), то любой выбранный столбец должен быть или в агрегирующей функции, или в GROUP BY - таковы правила построения запроса.

Есть форум, таблицы: Posts, Users. Надо сделать запрос, который будет возвращать текст поста(сообщения), информацию о пользователе, написавшем пост, и подсчитывает количество сообщений от этого юзера по всему форуму.

Re: Group by и тип text

Добавлено: 2009-11-03 23:48:53
Gamerman
vuzya писал(а): Есть форум, таблицы: Posts, Users. Надо сделать запрос, который будет возвращать текст поста(сообщения), информацию о пользователе, написавшем пост, и подсчитывает количество сообщений от этого юзера по всему форуму.
Используйте несколько запросов.