powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимально составить запрос
11 сообщений из 11, страница 1 из 1
Помогите оптимально составить запрос
    #38323005
bobahvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 2 таблички:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE `songs` (
  `id_song` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `id_artist` int(11) unsigned NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id_song`),
  KEY `id_artist` (`id_artist`),
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

CREATE TABLE `texts` (
  `id_text` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `id_song` int(10) unsigned NOT NULL,
  `text` text NOT NULL,
  `rating` decimal(2,1) NOT NULL DEFAULT '0.0',
  PRIMARY KEY (`id_text`),
  KEY `id_song` (`id_song`),
) ENGINE=InnoDB AUTO_INCREMENT=20134 DEFAULT CHARSET=utf8



Нужно сделать запрос, который вернет список всех песен по исполнителю. А также первое отсортированное значение (максимум или минимум, например) из таблицы t.

Но может быть вариант, что в таблице t не будет связи для таблицы s (по-русски: нет текстов для песни). Тогда мы должны вместо id_text получить null.
проще говоря вот такой запрос оптимизировать, точней переписать
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT 
    s.name,
    (SELECT t.id_text FROM texts t WHERE t.id_song = s.id_song ORDER BY t.rating DESC LIMIT 1) AS id_text
FROM 
    songs s 
WHERE id_artist = 7



В моих реалиях 150 000 songs, по 5 текстов в среднем на 1 song запрос (который опубликован выше) выполняется 9 секунд, что ужасно для фронтенда.

Помогите, пожалуйста, составить нормальный запрос.
...
Рейтинг: 0 / 0
Помогите оптимально составить запрос
    #38323206
MikkiMouse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bobahvas,

Непонятно зачем тянуть подзапросом значение максимума/минимума по рейтингу в 1 запросе.
Выбрал все композиции исполнителя, отсортировал по рейтингу - в первой записи у тебя будет нужное максимальное/минимальное значение.
2-й вариант - отдельным запросом вытянуть MIN(t.rating)/MAX(t.rating) композиций определенного исполнителя.

Оба варианта при наличии индексов будут достаточно быстрыми. То, что ты сейчас пытаешься делать, не нужно .
...
Рейтинг: 0 / 0
Помогите оптимально составить запрос
    #38323215
bobahvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MikkiMouse,

Хотелось бы пример под ваши слова.
2-й вариант не подходит. На 1 странице может быть около 400 песен. Т.е. 1 запрос на получение всего списка песен из таблицы songs и потом 400 запросов на получение минимума (или максимума) из таблицы texts

1-й вариан предполагает, что результат выборки будет таким:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
id_song | name | id_text
   1   Мое сердце 7
   1   Мое сердце 6
   1   Мое сердце 5
   2   Орбит без сахара 7
   2   Орбит без сахара 5
   3   Всадник из льда 4
   4   Название null


Что тоже "не есть хорошо".
Хотелось бы получить 1 запросом резальтат:
Код: sql
1.
2.
3.
4.
5.
id_song | name | id_text
   1   Мое сердце 7
   2   Орбит без сахара 7
   3   Всадник из льда 4
   4   Название null
...
Рейтинг: 0 / 0
Помогите оптимально составить запрос
    #38323238
MikkiMouse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bobahvas,

Значит Вы не можете толком объяснить чего хотите.
Исходя из приведенного результата, выборка может быть например такой:
Код: sql
1.
2.
3.
4.
5.
SELECT s.id_song, s.name, MAX(t.id_text)
FROM songs s
LEFT JOIN texts t USING (id_song)
WHERE s.id_artist = 7
GROUP BY s.id_song, s.name
...
Рейтинг: 0 / 0
Помогите оптимально составить запрос
    #38323294
bobahvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MikkiMouse,

абсолютно не таким. Я написал четко. Берем все песни, к ним добавляем id_text из таблицы texts. Причем не просто какое-то, и не мин мах id_text. А max(texts.rating).
...
Рейтинг: 0 / 0
Помогите оптимально составить запрос
    #38323295
bobahvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По-русски: Выбрать все песни, добавить к ним id самого популярного текста. Если текстов нет - поставить null. Думаю так ясно будет
...
Рейтинг: 0 / 0
Помогите оптимально составить запрос
    #38323303
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bobahvasПо-русски: Выбрать все песни, добавить к ним id самого популярного текста. Если текстов нет - поставить null. Думаю так ясно будет

http://www.sql.ru/forum/687908/faq-vyborka-pervoy-posledney-zapisi-v-gruppah
...
Рейтинг: 0 / 0
Помогите оптимально составить запрос
    #38323324
bobahvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc http://www.sql.ru/forum/687908/faq-vyborka-pervoy-posledney-zapisi-v-gruppah

Спасибо, это более продуктивно. Однако отработало не так как я планировал. Пример:
У меня 3 пользователя, 2 пользователя имеют посты с оценками. У 1 нет постов.

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

Сможете подсказать как изменить тот запрос для моего случая (использовал С1 по ссылке выше)
...
Рейтинг: 0 / 0
Помогите оптимально составить запрос
    #38323327
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bobahvas,

>> как изменить тот запрос для моего случая

добавить LEFT перед жоинтами
...
Рейтинг: 0 / 0
Помогите оптимально составить запрос
    #38323331
bobahvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc,

если сделать это с с1 - то не получится.
взял за основу с3 с лефт джойном, все работает. Всем спасибо за помощ
...
Рейтинг: 0 / 0
Помогите оптимально составить запрос
    #38323365
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bobahvasВ моих реалиях 150 000 songs, по 5 текстов в среднем на 1 song запрос (который опубликован выше) выполняется 9 секунд, что ужасно для фронтенда.


SELECT * FROM songs s, texts t WHERE s.id_song = t.id_song умножит N текстов на 1 сонгу. Нет лирики (если юзаете английский, то текст песни - lyrics) у сонги - результат неизвестен, NULL. Насколько я понимаю часть запроса - группировка GROUP BY по рейтингу и агрегатная функция типа MAX к группе. http://www.techonthenet.com/sql/group_by.php Если выкинуть поле типа text из таблицы texts он станет чистой таблицей rating.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимально составить запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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