LINUX.ORG.RU

Как достать все поля, но где один столбец уникальный?

 ,


0

2

Есть запрос, который возвращает https://i.stack.imgur.com/PK4xT.png Мне нужно достать все столбцы, но только уникальных записей (id 2,3,5,10,11,12). То есть те, где типы (поле type) не повторяются. Достать только уникальные столбцы можно через Distinct, но он возвращает не все столбцы, а мне нужны все. Также в сети говорят, что можно использовать SELECT * WHERE ….. GROUP BY type, но у меня вылетает ошибка:

#1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'roomtest.rooms.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by.

В сети советуют убрать в sql_mode only_full_group_by, но проблема в том, что в моей mysql 8 и так нет only_full_group_by…

Подскажите, каким образом можно достать все столбцы уникальных записей?

Запрос выглядит вот таким образом:

SELECT * FROM rooms WHERE id NOT IN (SELECT room_id FROM `bron` WHERE
'2022-03-04 13:00:00' <= end AND '2022-03-04 13:00:00' >= start OR
'2022-03-06 11:00:00' <= end AND '2022-03-06 11:00:00' >= start)

SELECT *

Почитай, как работает group by и having, если мя правильно понял вопрос

советуют убрать only_full_group_by

Не слушай аутистов, это переключатель между «выдать ошибку» и «выдать случайную строку из подходящих». В 95% случаев первое предпочтительнее.

bron

Убиват.

sislochka
()

В сети советуют убрать в sql_mode only_full_group_by

Не надо.

SELECT *
  FROM `rooms`
  WHERE `id` IN (
    SELECT MIN(`id`)
      FROM `rooms`
      WHERE `id` NOT IN (
        SELECT `room_id`
          FROM `bron`
          WHERE ('2022-03-04 13:00:00' <= `end` AND '2022-03-04 13:00:00' >= `start`)
          OR ('2022-03-06 11:00:00' <= `end` AND '2022-03-06 11:00:00' >= `start`)
      )
      GROUP BY `type`
  )
  ORDER BY `id`;
Darth_Revan ★★★★★
()
Ответ на: комментарий от sislochka

Опасно, поудаляет ещё SQL_MODE’ы все.
Плюс ему ещё с этим NOT IN, в котором ещё и OR, жить.

Darth_Revan ★★★★★
()
Последнее исправление: Darth_Revan (всего исправлений: 1)

в моей mysql 8

SELECT
	*
FROM (
	SELECT
		 r.id
		,r.`type`
		,r.price
		,ROW_NUMBER() OVER (PARTITION BY r.`type`, r.price) AS rn
	FROM
		rooms r
) rx
WHERE
	rx.rn = 1
Toxo2 ★★★★
()
Последнее исправление: Toxo2 (всего исправлений: 1)
Ответ на: комментарий от Anoxemian

Что именно вас тут напугало?

Вы про

KEY `rooms_type_IDX` (`type`,`price`) USING BTREE
?

Toxo2 ★★★★
()
Ответ на: комментарий от Anoxemian

Но - да, с min() и group by по этой задаче, конечно, проще.

Хотелось посмотреть, как там в свежих MySQL с окнами - ничего, оказывается, работают )

Toxo2 ★★★★
()

В Postgres для такого есть distinct on ..., погугли, может в MySQL есть что-то подобное.

theNamelessOne ★★★★★
()
Ответ на: комментарий от Anoxemian

О, а расскажи, как нормальные пони эффективно решают задачу «оставить в таблице только последнее сообщение каждого пользователя». Т.е. сгруппировать по юзеру, найти having count > 1 и из них снести все, кроме одного самого старого по дате (если даты одинаковы, оставить одно любое).

Понятно, что с уникальным сквозным ID вместо даты было бы простенько, но увы

sislochka
()
Последнее исправление: sislochka (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.