Mysql Помогите оптимизировать запрос

D_Pavel

Новичок
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
 

D_Pavel

Новичок
видно что как минимум в двух местах повторяются одинаковые выборки. На скорость это может и не влияет, но выглядит очень не красиво и громоздко.
Суть запроса: это для форума. Мне нужно выбрать темы из таблицы тем, при условии что существуют сообщения для этих тем в таблице сообщений, у которых автор - конкретный пользователь. Я это сделал через join таблицы тем с таблицей сообщений ограниченной по нику пользователя.
Но еще нужно посчитать сколько всего сообщений в этих темах, от всех пользователей - "count", длину строки самого длинного заголовка тем - "lentitle", и узнать имя пользователя который написал последнее сообщение - "lastnik"
 

D_Pavel

Новичок
Пробую по частям.

SELECT *
FROM topics
JOIN messages ON
messages.parent = topics.key
AND messages.nik = 'Admin'

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

max( CHAR_LENGTH( title ) ) lentitle
 

D_Pavel

Новичок
Даже еще упростил, все равно не понятно:

SELECT table.text
FROM table



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

max( CHAR_LENGTH( table.text ) )
 

WMix

герр M:)ller
Партнер клуба
SELECT max( CHAR_LENGTH( table.text ) )
FROM table
group by id
 

riff

Новичок
Пробую по частям.
Думаю это ответ на твой вопрос.

CREATE TEMPORARY TABLE tmp AS
SELECT
topics.key,
t2.lentitle,
topics.nik ts,
topics.datetime topicdate,
topics.title
FROM `topics`
...

И по отдельности запрашивай свою статистику из tmp.
 
Последнее редактирование:

D_Pavel

Новичок
наверное вариант со временной таблицей самый хороший.
 

D_Pavel

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

riff

Новичок
Пока связь с базой не разорвана, со временной можешь делать что угодно и не один раз.
 
Сверху