Отвечая на ваш прямой вопрос "как избежать ...":
Эта ошибка появляется, когда вы указываете столбец в области SELECT оператора, которого нет в разделе GROUP BY и нетЯ не могу сказать, что не являюсь частью агрегирующей функции, такой как MAX, MIN, AVG
, в ваших данных
SELECT
ID, site, min(time)
FROM
table
GROUP BY
id
Я не сказал, что делать с САЙТОМ;это либо ключ группы (в этом случае я получу каждую уникальную комбинацию идентификатора, сайта и минимального времени в каждой), либо он должен быть агрегирован (например, максимальное количество сайтов на идентификатор)
Это нормально:
SELECT
ID, max(site), min(time)
FROM
table
GROUP BY
id
SELECT
ID, site, min(time)
FROM
table
GROUP BY
id,site
Я просто не могу не указать что с ним делать - что должна возвращать база данных в таком случае?(Если вы все еще боретесь, скажите мне в комментариях, что, по вашему мнению, должен делать БД, и я лучше пойму ваше мышление, чтобы я мог сказать вам, почему он не может этого сделать).Программист базы данных не может принять это решение за вас;Вы должны сделать это
Обычно люди спрашивают об этом, когда хотят идентифицировать:
Минимальное время для идентификатора, а также получать все остальные данные строки.например, «Каковы полные самые ранние данные записи для каждого идентификатора?»
В этом случае вы должны написать запрос, который идентифицирует минимальное время для идентификатора, а затем присоединить этот подзапрос к основной таблице данных по id =id и время = mintime.БД запускает подзапрос, формирует список минимального времени для каждого идентификатора, затем он фактически становится фильтром основной таблицы данных
SELECT * FROM
(
SELECT
ID, min(time) as mintime
FROM
table
GROUP BY
id
) findmin
INNER JOIN table t ON t.id = findmin.id and t.time = findmin.mintime
Что вы не можете сделать, это начать помещать в запрос другие данные, которые вы хотитеэто делает группировку, потому что вы либо должны группировать по столбцам, которые вы добавляете (делает группу более детализированной, а не по вашему желанию), либо вам нужно их агрегировать (и тогда это не обязательно происходит из той же строки, что идругие агрегированные столбцы - минимальное время - от строки 1, минимальное - от строки 3 - не то, что вам нужно)
Рассматривая вашу актуальную проблему:
Значение идентификатора должно существовать вдва стола.Значение типа должно быть самой большой группой по идентификатору.Значение Time должно быть наименьшим в самой большой группе типов.
Оставляя решение, которое требует наличия или аналитики, вы можете разобраться с теорией здесь:
Вам нужно найти группу максимального типа по идентификатору, а затем присоединить ее обратно к таблице, чтобы получить и другие релевантные данные (необходимо время) для этого идентификатора / максимального типа, а затем для этого нового отфильтрованного набора данных вам понадобятся идентификатор и мин.время
SELECT t.id,min(t.time) FROM
(
SELECT
ID, max(type) as maxtype
FROM
table
GROUP BY
id
) findmax
INNER JOIN table t ON t.id = findmax.id and t.type = findmax.maxtype
GROUP BY t.id
Если вы не можете понять почему, дайте мне знать