Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите исправить простой запрос / 25 сообщений из 56, страница 1 из 3
26.11.2013, 09:14:23
    #38477622
D_Pavel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
Выбираются все темы форума из таблицы тем, а так же количество сообщений в этих темах из таблицы сообщений, и еще нужно выбрать имя автора самого нового сообщения в каждой теме, это я не знаю как сделать, у меня выбирается имя автора самого старого сообщения. Подскажите

Код: sql
1.
SELECT topics.*, count(messages.text) as count, messages.nik FROM `messages` right JOIN `topics` ON messages.parent=topics.key GROUP BY topics.key, topics.datetime 
...
Рейтинг: 0 / 0
26.11.2013, 09:21:36
    #38477635
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
...
Рейтинг: 0 / 0
26.11.2013, 09:24:57
    #38477640
D_Pavel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
Спасибо, сам уже посмотрел!
Так сделал:

Код: sql
1.
2.
3.
4.
5.
SELECT topics . * , count( messages.text ) AS count, SUBSTR( min( CONCAT( messages.datetime, messages.nik ) ) , 20 ) 
FROM `messages` 
RIGHT JOIN `topics` ON messages.parent = topics.key
GROUP BY topics.key, topics.datetime
LIMIT 0 , 30
...
Рейтинг: 0 / 0
26.11.2013, 10:09:42
    #38477715
D_Pavel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
Еще один вопрос:
Почему так не работает?
Код: sql
1.
SELECT * FROM topics right JOIN messages ON messages.parent = topics.key as t1, (SELECT max(CHAR_LENGTH(topics.title)) FROM topics) as t2

выдает ошибку
Код: sql
1.
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'as t1, (SELECT max(CHAR_LENGTH(topics.title)) FROM topics) as t2' at line 1


А так работает:
Код: sql
1.
SELECT * FROM topics right JOIN messages ON messages.parent = topics.key



И так тоже работает:
Код: sql
1.
SELECT * FROM topics as t1, (SELECT max(CHAR_LENGTH(topics.title)) FROM topics) as t2
...
Рейтинг: 0 / 0
26.11.2013, 10:24:47
    #38477743
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
Правильно не работает.... ты чё пытаешься алиасить-то?
...
Рейтинг: 0 / 0
26.11.2013, 12:25:27
    #38477968
D_Pavel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
Ага, разобрался
...
Рейтинг: 0 / 0
29.11.2013, 06:44:58
    #38482794
D_Pavel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
Еще вопрос. Вот такой запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT
	topics.nik,
	topics.datetime,
	topics.title,
	count( messages2.text ) count,
	SUBSTR( max( CONCAT( messages2.datetime, messages2.nik ) ) , 20 ) lastnik
FROM `topics`
JOIN `messages` ON messages.parent = topics.key
	AND messages.nik = 'Admin'
JOIN `messages` as messages2 ON messages2.parent = topics.key
GROUP BY topics.key
ORDER BY topics.datetime DESC 
LIMIT 40




Мне нужно выбрать темы из таблицы тем, при условии что существуют сообщения в этих темах в таблице сообщений, у которых автор - конкретный пользователь. Я это сделал через join таблицы тем с таблицей сообщений ограниченной по нику пользователя.
Но еще нужно посчитать сколько всего сообщений в этих темах, от всех пользователей, я это сделал через второй join с таблицей сообщений. Но результат получается не правильный - количество сообщений считается с возведением в квадрат количества сообщений от каждого пользователя.
...
Рейтинг: 0 / 0
29.11.2013, 07:17:52
    #38482803
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
D_Pavel,

разделите два посчета, например так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select
  (select count( messages2.text ) from `messages` as messages2 where messages2.parent = zz.key) count
  zz.*
FROM 
(
SELECT
	topics.nik,
	topics.datetime,
	topics.title,
	SUBSTR( max( CONCAT( messages2.datetime, messages2.nik ) ) , 20 ) lastnik
FROM `topics`
JOIN `messages` ON messages.parent = topics.key
	AND messages.nik = 'Admin'
GROUP BY topics.key
ORDER BY topics.datetime DESC 
LIMIT 40
) zz
...
Рейтинг: 0 / 0
29.11.2013, 07:58:27
    #38482817
D_Pavel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
Спасибо!
Сделал по аналогии так, но мне кажется что это не оптимально, присутствуют одинаковые выборки:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
select
	( select
		count( messages2.text )
	from `messages` as messages2 where messages2.parent = zz.key) count,
	( select
		SUBSTR( max( CONCAT( messages2.datetime, messages2.nik ) ) , 20 )
	from `messages` as messages2 where messages2.parent = zz.key) lastnik,
	zz.*
FROM 
(
SELECT
	topics.key,
	t2.lentitle,
	topics.nik ts,
	topics.datetime topicdate,
	topics.title
FROM `topics`
JOIN `messages` ON messages.parent = topics.key
	AND messages.nik = 'Admin',
(
	SELECT max( CHAR_LENGTH( title ) ) lentitle
	FROM topics
) AS t2
GROUP BY topics.key
ORDER BY topics.datetime DESC 
LIMIT 40)zz



Возможно оптимизировать быстродействие или упростить запрос?
...
Рейтинг: 0 / 0
29.11.2013, 08:02:39
    #38482819
D_Pavel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
И еще у меня в этом запросе не правильно считает lentitle - длинна самого длинного заголовка из выбранных, почему-то просматривает всю таблицу тем, а не отсеянные темы.
...
Рейтинг: 0 / 0
29.11.2013, 08:05:23
    #38482821
D_Pavel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
Последнюю ошибку вот так исправил, но кажется запрос стал еще неоптимальнее:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
select
	( select
		count( messages2.text )
	from `messages` as messages2 where messages2.parent = zz.key) count,
	( select
		SUBSTR( max( CONCAT( messages2.datetime, messages2.nik ) ) , 20 )
	from `messages` as messages2 where messages2.parent = zz.key) lastnik,
	zz.*
FROM 
(
SELECT
	topics.key,
	t2.lentitle,
	topics.nik ts,
	topics.datetime topicdate,
	topics.title
FROM `topics`
JOIN `messages` ON messages.parent = topics.key
	AND messages.nik = 'Admin',
(
	SELECT max( CHAR_LENGTH( title ) ) lentitle
	FROM topics JOIN `messages` ON messages.parent = topics.key
	AND messages.nik = 'Admin'
) AS t2
GROUP BY topics.key
ORDER BY topics.datetime DESC 
LIMIT 40)zz
...
Рейтинг: 0 / 0
29.11.2013, 08:30:29
    #38482837
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
D_Pavel,

оптимальный-нешоптимальный... таких слов не бывает.

запрос должен , в порядке значимости:

1. выдавать правильный результат
2. быть в пределах скорости указаных в техзадании
3. не грузить сервер
4. быть более-менее понятным автору через 3 месяца
5. вызывать естетическое удоволъствие у эстетов скл.ру

P.S. вместо выполнения пунктов 4 и 5 можно пойти пить пиво
и играть в преферансе... или с женшинами...
...
Рейтинг: 0 / 0
29.11.2013, 08:57:16
    #38482850
D_Pavel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
То есть если мой запрос по два раза выбирает одни и те же данные и укладывается в нужное время, то оставить все как есть?
Он даже у меня не вызывает эстетического удовольствия.
...
Рейтинг: 0 / 0
29.11.2013, 10:17:36
    #38482937
D_Pavel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
Пробую по частям.
Код: sql
1.
2.
3.
4.
5.
SELECT *
FROM topics
JOIN messages ON
 messages.parent = topics.key
 AND messages.nik = 'Admin'



Как в этот запрос вставить подсчет длины самой длинной строки title ?

Код: sql
1.
max( CHAR_LENGTH( title ) ) lentitle 
...
Рейтинг: 0 / 0
29.11.2013, 10:51:52
    #38482971
D_Pavel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
Даже еще упростил, все равно не понятно:

Код: sql
1.
2.
SELECT table.text 
FROM table 


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

Код: sql
1.
max( CHAR_LENGTH( table.text ) ) 
...
Рейтинг: 0 / 0
29.11.2013, 11:14:51
    #38482988
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
D_PavelВыбираются все темы форума из таблицы тем, а так же количество сообщений в этих темах из таблицы сообщений, и еще нужно выбрать имя автора самого нового сообщения в каждой теме http://sqlfiddle.com/#!2/7a15a/1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select * 
from topics t
left join 
  (
    select m.parent, COUNT(*) qty, MAX(m.KEY) msg
    from messages m
    group by m.parent
  ) q 
  join messages m on m.KEY=q.msg
  on q.parent=t.KEY;
...
Рейтинг: 0 / 0
29.11.2013, 11:18:03
    #38482991
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
...
Рейтинг: 0 / 0
29.11.2013, 11:43:26
    #38483019
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
D_PavelЕще вопрос.

Мне нужно выбрать темы из таблицы тем, при условии что существуют сообщения в этих темах в таблице сообщений, у которых автор - конкретный пользователь.
Но еще нужно посчитать сколько всего сообщений в этих темах, от всех пользователей http://sqlfiddle.com/#!2/71133/2
...
Рейтинг: 0 / 0
29.11.2013, 11:48:33
    #38483029
D_Pavel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
у тебя получается условие по nik из таблицы topics, а должно быть по nik из таблицы messages. То есть выборка topics с участием nik в messages, не важно кто автор в topics.
...
Рейтинг: 0 / 0
29.11.2013, 12:03:53
    #38483050
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
D_Pavelу тебя получается условие по nik из таблицы topics, а должно быть по nik из таблицы messages. То есть выборка topics с участием nik в messages, не важно кто автор в topics.Сорь, не понял сразу.
FIX: http://sqlfiddle.com/#!9/894fc/1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select t.*, count(*) qty
from 
  (
    select m.parent
    from messages m
    where m.usr='adm'
    group by m.parent
  ) p
join topics t on t.key=p.parent
join messages m on m.parent=t.key
group by t.key
;
...
Рейтинг: 0 / 0
29.11.2013, 12:30:38
    #38483114
D_Pavel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
Спасибо, классный запрос
...
Рейтинг: 0 / 0
29.11.2013, 16:16:45
    #38483639
D_Pavel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
Собрал все вместе, немного допилил, получилось так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
set @max=0;
select *, @max:=IF(tmp.lentitle>@max, tmp.lentitle, @max) as maxlentitle from (
	SELECT
		*,
		CHAR_LENGTH(topics.title) as lentitle,
		(SELECT CONCAT( count( text ), '	', max( CONCAT( datetime, '	', nik ) ) ) 
			FROM messages
			WHERE parent = topics.key
		)count_lastnik
	FROM topics
	where topics.key in
		(SELECT parent
			FROM messages
			WHERE messages.nik = 'Admin'
			GROUP BY parent
		)
) as tmp



lentitle буду получать из последней строки результата запроса.
Все верно получилось? Может что-то не нормально? Я новичок, не знаю возможностей MySQL, поэтому могу что-то написать очень глупое, поправьте пожалуйста.
...
Рейтинг: 0 / 0
29.11.2013, 16:37:24
    #38483690
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
D_PavelТо есть если мой запрос по два раза выбирает одни и те же данные и укладывается в нужное время, то оставить все как есть?
Он даже у меня не вызывает эстетического удовольствия.

в жизни должны быть приоритеты.
Для програмиста -- эстетика кода вполне
важна, но на 5-ом месте (примерно по приведеному списку).

Без пункта #2 и #3 говорить об естетике просто рано.
Укажите имеюшуюся скорость, какие обьемы есть или
как ожидаются, какие требования к скорости,
план запроса... ну и все такое.

Или уточните что вам по барабану скорость и вы тут просто
изучаете возможности СКЛ-а в отрыве от конкретной задачи.
Что тоже интересно само по себе :-)
...
Рейтинг: 0 / 0
02.12.2013, 06:08:55
    #38485418
D_Pavel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
Скорее последнее, так как до больших объемов еще очень далеко, база только начинает заполняться. НО по опыту другого аналогичного проекта с уже приличной базой, даже при самых оптимальных запросах(наверное) которые делал опытный эскуэльщик, потребовался дорогой выделенный сервер. Мне бы хотелось чтобы база как можно дольше работала и росла на дешевом виртуальном сервере и не тормозила.
...
Рейтинг: 0 / 0
02.12.2013, 06:56:35
    #38485430
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить простой запрос
D_PavelСкорее последнее, так как до больших объемов еще очень далеко, база только начинает заполняться. НО по опыту другого аналогичного проекта с уже приличной базой, даже при самых оптимальных запросах(наверное) которые делал опытный эскуэльщик, потребовался дорогой выделенный сервер. Мне бы хотелось чтобы база как можно дольше работала и росла на дешевом виртуальном сервере и не тормозила.

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

Не имея в наличии реальной проблемы, не имея в наличии
больших данных -- вы даже план реальный не получите.

Кроме того, пока вы доживете до больших
обьемов -- структура данных и все апликация
поменяется на 90%...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите исправить простой запрос / 25 сообщений из 56, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]