powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / LEFT JOIN одной записи
12 сообщений из 12, страница 1 из 1
LEFT JOIN одной записи
    #37256684
Фотография evgeny12000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Существует 2 таблицы.

table: groups
group_id | name
--------------------
1 | text
2 | text
3 | text
4 | text
5 | text

table: items
item_id | group_id
------------------
1 | 1
2 | 1
3 | 1
4 | 2
5 | 2

Нужно вынуть все записи из groups и к каждой записи присоединить одну запись из items (первую либо любую запись)

В принципе это можно сделать так:

SELECT * FROM groups g
LEFT JOIN (SELECT * FROM items group by group_id) i ON(g.group_id=i.group_id)

Тут запрос "SELECT * FROM items group by group_id" является тяжёлым.

Есть какое то другое решение ?
...
Рейтинг: 0 / 0
LEFT JOIN одной записи
    #37256703
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
любую
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT g.*, i.*   
FROM 
   groups AS g
LEFT JOIN
   items AS i
ON g.group_id = i.group_id
GROUP BY
   g.group_id
про первую смотрите в FAQ-первая последняя запись в группе
...
Рейтинг: 0 / 0
LEFT JOIN одной записи
    #37256707
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если из items нужно вернуть только одно поле, то так будет быстрее
Код: plaintext
1.
2.
3.
SELECT g.*, 
(SELECT item_id FROM items i where g.group_id=i.group_id limit  1 ) as item_id
FROM groups g
...
Рейтинг: 0 / 0
LEFT JOIN одной записи
    #37257163
Фотография evgeny12000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinovлюбую
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT g.*, i.*   
FROM 
   groups AS g
LEFT JOIN
   items AS i
ON g.group_id = i.group_id
GROUP BY
   g.group_id
про первую смотрите в FAQ-первая последняя запись в группе

Этот запрос требует тех же ресурсов что и мой запрос.
Я ищу альтернативу, изначально не присоединять лишние записи.
Очень странно что в mysql не реализовано какова то боле легкого решения.
...
Рейтинг: 0 / 0
LEFT JOIN одной записи
    #37257211
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Этот запрос требует тех же ресурсов что и мой запрос.
А давайте-ка explain-ы обоих запросов в студию. Иначе никто вам не поверит.
>Я ищу альтернативу, изначально не присоединять лишние записи.
С чего вы взяли, что что-то лишнее куда-то будет присоединяться?
>Очень странно что в mysql не реализовано какова то боле легкого решения.
Можете указать, где такое решение реализовано и как выглядит?
...
Рейтинг: 0 / 0
LEFT JOIN одной записи
    #37257265
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir>Очень странно что в mysql не реализовано какова то боле легкого решения.
Можете указать, где такое решение реализовано и как выглядит?В Оракле, действительно, желаемое можно сделать аналитическими функциями, которых нет в MySQL. Правда, не факт, что там это потребует меньшего количества алгоритмических действий.
...
Рейтинг: 0 / 0
LEFT JOIN одной записи
    #37257270
Фотография evgeny12000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty112если из items нужно вернуть только одно поле, то так будет быстрее
Код: plaintext
1.
2.
3.
SELECT g.*, 
(SELECT item_id FROM items i where g.group_id=i.group_id limit  1 ) as item_id
FROM groups g


Интересный вариант. Надо будет протестировать его производительность.
Спасибо.
...
Рейтинг: 0 / 0
LEFT JOIN одной записи
    #37257486
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir...
>Очень странно что в mysql не реализовано какова то боле легкого решения.
Можете указать, где такое решение реализовано и как выглядит?
в МС СКЛ - cross / outer apply
...
Рейтинг: 0 / 0
LEFT JOIN одной записи
    #37258074
Фотография evgeny12000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И так результаты тестирования 3 перечисленных вариантов.

1)
Код: plaintext
1.
2.
SELECT * FROM users u
LEFT JOIN (SELECT * FROM video_stats group by member_id) v
ON(u.member_id=v.member_id);

id select_type table type possible_keys key key_len ref rows 1 PRIMARY u ALL (NULL) (NULL) (NULL) (NULL) 14 1 PRIMARY <derived2> ALL (NULL) (NULL) (NULL) (NULL) 16 2 DERIVED video_stats index (NULL) NewIndex4 5 (NULL) 1359239
...
Рейтинг: 0 / 0
LEFT JOIN одной записи
    #37258107
Фотография evgeny12000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И так результаты тестирования 3 перечисленных вариантов.

1) Мой первый вариант.
Код: plaintext
1.
2.
SELECT * FROM users u
LEFT JOIN (SELECT * FROM video_stats group by member_id) v
ON(u.member_id=v.member_id);

id select_type table type possible_keys key key_len ref rows 1 PRIMARY u ALL (NULL) (NULL) (NULL) (NULL) 14 1 PRIMARY <derived2> ALL (NULL) (NULL) (NULL) (NULL) 16 2 DERIVED video_stats index (NULL) NewIndex4 5 (NULL) 1359239
Execution Time : 22766 ms
Mysql проходит по всем записям таблицы video_stats, запрос тяжёлый.



2) Вариант предложенный Alex_Ustinov
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT u.*,v.*  
FROM
   users AS u
LEFT JOIN
   video_stats AS v
ON u.member_id=v.member_id
GROUP BY
   u.member_id;

id select_type table type possible_keys key key_len ref rows filtered Extra1 SIMPLE u ALL (NULL) (NULL) (NULL) (NULL) 14 100.00 Using temporary; Using filesort1 SIMPLE v ref NewIndex4 NewIndex4 5 test.u.member_id 75511 100.00
Execution Time :22610 ms

Тут преимущество - mysql проходит только по 75511 записям.
Минус - использования Temporary Table и Filesort
Время выполнение взяло также много как и в первом варианте.



3) Вариант предложенный qwerty112
Код: plaintext
1.
2.
3.
SELECT u.*,
(SELECT video_id FROM video_stats v where u.member_id=v.member_id limit  1 ) as video_id
FROM users u;

id select_type table type possible_keys key key_len ref rows filtered Extra1 PRIMARY u ALL (NULL) (NULL) (NULL) (NULL) 14 100.00 2 DEPENDENT SUBQUERY v ref NewIndex4 NewIndex4 5 test.u.member_id 75511 100.00 Using where
Execution Time :328 ms

Запрос завершился поразительно быстро (в 68 раз быстрее прошлых запросов)
Третий вариант победитель ! :-)
...
Рейтинг: 0 / 0
LEFT JOIN одной записи
    #37258128
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и взгляните на всевозможные варианты FAQ: Выборка первой/последней записи в группах
вы выбрали запрос С3 и не вовсех случаях он самый быстрый.
Просмотрите Референсы, особенно вот здесь в конце. Все зависит от объема данных.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
LEFT JOIN одной записи
    #39447883
carf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
evgeny12000, Дуратские вопросы, но все же... Чем тестировали? Как можно так проверить?
Хочу расскачать это умение :)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / LEFT JOIN одной записи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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