powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка минимальных значений из одной таблицы с группировкой по имени из другой
17 сообщений из 17, страница 1 из 1
Выборка минимальных значений из одной таблицы с группировкой по имени из другой
    #40018553
artyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу помочь с решением данного вопроса. Есть две таблицы и данные для них

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE `main_table`(
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
    `name` TINYTEXT NOT NULL,
    `sometext` TINYTEXT NOT NULL,
    PRIMARY KEY(`id`)
) ENGINE = InnoDB;

CREATE TABLE `add_table`(
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
    `name_id` INT UNSIGNED NOT NULL,
    `distance` INT UNSIGNED NOT NULL,
    PRIMARY KEY(`id`),
    CONSTRAINT `addtable_ibfk_maintable` FOREIGN KEY(`name_id`) REFERENCES `main_table`(`id`) ON DELETE CASCADE
) ENGINE = InnoDB;

Код: plaintext
INSERT INTO `main_table` (`name`, `sometext`) VALUES ('name1', 'text1'), ('name2', 'text2'), ('name3', 'text3'), ('name3', 'text4'), ('name3', 'text5');

Код: plaintext
INSERT INTO `add_table` (`name_id`, `distance`) VALUES (1, 100), (4, 200), (5, 300), (3, 400), (2, 500);

Как с помощью одного запроса на выходе получить:

name_id name distance 1 name1 100 4 name3 200 5 name2 500
...
Рейтинг: 0 / 0
Выборка минимальных значений из одной таблицы с группировкой по имени из другой
    #40018564
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если Вы ещё постараетесь объяснить логику получения результата...

PS. fiddle
...
Рейтинг: 0 / 0
Выборка минимальных значений из одной таблицы с группировкой по имени из другой
    #40018571
artyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Спасибо за фидл)

Логика следующая, в таблице main_table около 10 строк, в add_table тысячи, надо выбрать строки с минимальным distance из add_table чтобы main_table.name не повторялся, а add_table.id нужен для дальнейшей работы. Сгруппировать их только по add_table.name_id не получится, так как main_table.name может повторяться, но при этом main_table.sometext будет разным.
...
Рейтинг: 0 / 0
Выборка минимальных значений из одной таблицы с группировкой по имени из другой
    #40018587
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бред какой-то...

artyman
Логика следующая, в таблице main_table около 10 строк, в add_table тысячи
Это, блин, статистика, а ни хрена не логика.

Смотрим на FK. Строим соотв. запрос:
Код: sql
1.
2.
3.
SELECT *
FROM main_table m
JOIN add_table a ON m.id = a.name_id;


соответственно получаем
idnamesometextidname_iddistance1name1text1111002name2text2525003name3text3434004name3text4242005name3text535300
Что дальше? Какова логика получения из этих данных показанного выше результата? Особенно - согласно какой логике сформирована третья строка результата? подробненько... а заодно - сразу объясняя, почему соответствующая логика не отражена с в структуре хранения.
...
Рейтинг: 0 / 0
Выборка минимальных значений из одной таблицы с группировкой по имени из другой
    #40018590
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artyman,

CONCAT(name, cometext) при группировке.
...
Рейтинг: 0 / 0
Выборка минимальных значений из одной таблицы с группировкой по имени из другой
    #40018620
artyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina


соответственно получаем
idnamesometextidname_iddistance1name1text1111002name2text2525003name3text3434004name3text4242005name3text535300


В вашем результате name3 повторяется три раза, а надо чтобы была строка только с минимальным значением distance, то есть строка 4, значение 200. Но в тоже самое время мне необходимо знать, что это значению 200 соответсвует name_id = 4

Если подскажите как поправить структуру хранения, для получения нужного результата, указанного в первом посте - будет замечательно. Появилась проблема - ищу помощи с вариантом решения, был бы профессионал, вряд ли бы спрашивал.

Если отправить такой запрос, то результат нужный, но как к нему добавить еще add_table.name_id или main_table.id я не знаю.

Код: sql
1.
2.
3.
SELECT (SELECT name FROM main_table WHERE id = name_id) as nname, MIN(distance) 
FROM add_table 
GROUP BY nname;


nname MIN(distance)name1 100name3 200name2 500
...
Рейтинг: 0 / 0
Выборка минимальных значений из одной таблицы с группировкой по имени из другой
    #40018621
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artyman
В вашем результате name3 повторяется три раза

Ясен пень, я всего лишь связал таблицы, ориентируясь на внешний ключ, без дальнейшей обработки.

artyman
надо чтобы была строка только с минимальным значением distance

FAQ: Выборка первой/последней записи в группах
...
Рейтинг: 0 / 0
Выборка минимальных значений из одной таблицы с группировкой по имени из другой
    #40018625
artyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Спасибо, работает! Буду выбирать более быстрый метод
...
Рейтинг: 0 / 0
Выборка минимальных значений из одной таблицы с группировкой по имени из другой
    #40018631
artyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Всё таки поторопился, опять же в моей задаче не получается так как хотелось бы, потому что значение main_table.name не уникально.
И например такой запрос, выдает опять же не тот результат.

Код: sql
1.
2.
3.
4.
5.
6.
7.
select u.id, u.name, p0.distance 
      from main_table u join add_table p0
        on p0.id = ( select p1.id 
                       from add_table p1 
                      where p1.name_id=u.id 
                      order by p1.distance, p1.id 
                      limit 1);



id name distance1name11002name25003name34004name32005name3300

Не должно быть строк 3, 4 и 5, а только одна 4,name3,200 - потому что 200 это минимальное значение в этих трех строках.
...
Рейтинг: 0 / 0
Выборка минимальных значений из одной таблицы с группировкой по имени из другой
    #40018655
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artyman,

Чтобы оно стало уникальным, к нему надо добавить то поле, которое делает его уникальным, написал же CONCAT() должен помочь. Ну или делать группировку по паре полей, но тогда и дробление групп будет более мелким.
Как вариант, получив id минимальной записи можно обернув снаружи запрос получить по нему нужной name.

Смотря что надо. Не очень понял задачу..
...
Рейтинг: 0 / 0
Выборка минимальных значений из одной таблицы с группировкой по имени из другой
    #40018669
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artyman , у Вас, блин, группа - это что? это одинаковые `name` . А ни фига не `name_id` .
...
Рейтинг: 0 / 0
Выборка минимальных значений из одной таблицы с группировкой по имени из другой
    #40018714
artyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109,
Задача выбрать уникальное name, минимальное значение distance для него, а id этого name. Не получилось с помощью CONCAT сделать так.
...
Рейтинг: 0 / 0
Выборка минимальных значений из одной таблицы с группировкой по имени из другой
    #40018719
artyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

но как объединить по name, если одинаковые только name_id?
...
Рейтинг: 0 / 0
Выборка минимальных значений из одной таблицы с группировкой по имени из другой
    #40018780
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artyman
Задача выбрать уникальное name, минимальное значение distance для него
Группа по name и минимум по distance. Они в разных таблицах, JOIN.

artyman
а id этого name.
Если имеется в виду id из таблицы main_table - то одному name соответствует несколько id, и задача нерешаема.
Если имеется в виду name_id из таблицы add_table, то она соответствует выбранному distance.
...
Рейтинг: 0 / 0
Выборка минимальных значений из одной таблицы с группировкой по имени из другой
    #40019146
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artyman, если ещё не решилось, то как-то так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT m2.id AS id, m2.name, a2.distance 
FROM add_table a2
JOIN (
  SELECT m.name, MIN(a.distance) AS d
  FROM main_table m
  JOIN add_table a ON m.id = a.name_id
  GROUP BY m.name
) tmp ON tmp.d = a2.distance
JOIN main_table m2 ON m2.id = a2.name_id
;



Но, кмк, это можно упростить. За упрощением уже к Akina, сейчас не так часто Мускуль в работе..

Суть запроса:
Внутренним подселектом выбираем минимальное distance для имени.
Затем джойним снова на таблицу расстояний и получаем те записи, где расстояния минимальны. По внешнему ключу джойним основную табличку, получая тест имени и идент записи.
...
Рейтинг: 0 / 0
Выборка минимальных значений из одной таблицы с группировкой по имени из другой
    #40019470
Dino_zavr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну или как то так
Код: plsql
1.
2.
3.
4.
SELECT `name_id`,`name`,`distance` FROM
  (SELECT a.name_id,m.`name`,a.distance, row_number()over(partition by `name` order by `distance` asc) as rn
  FROM main_table m cross join add_table a on m.id = a.name_id) t
  Where rn=1;
...
Рейтинг: 0 / 0
Выборка минимальных значений из одной таблицы с группировкой по имени из другой
    #40020638
artyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dino_zavr
ну или как то так
Код: plsql
1.
2.
3.
4.
SELECT `name_id`,`name`,`distance` FROM
  (SELECT a.name_id,m.`name`,a.distance, row_number()over(partition by `name` order by `distance` asc) as rn
  FROM main_table m cross join add_table a on m.id = a.name_id) t
  Where rn=1;



А вот это реально сработало как надо, потому что еще отсекло строки с одинаковыми distance и name.

Всем огромное спасибо, а самому еще учиться и учиться)
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка минимальных значений из одной таблицы с группировкой по имени из другой
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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