axe_lankaster13
@axe_lankaster13
C++ разраб с большими планами

Как выбрать только одну строку с нужными значениями?

Всем здравствуйте,
Есть таблица с пользователями, где каждый пользователь имеет id,
и есть таблица с сообщениями, где каждое сообщение является строкой и имеет два поля для id отправителей. Сообщений много, некоторые совпадают по обоим id.
Пример:
5e9a2b1c8dbd5787159211.png
Где "id" - порядковый номер сообщения, "fsender_id" - id отправителя, а "ssender_id" - id получателя.
Допустим, выполняется запрос для пользователя с id = 1. Тогда все сообщения, отправленные им или ему будут иметь fsender_id = 1 или ssender_id = 1. Тогда необходимо выбрать из таблицы только те строки, где fsender_id или ssender_id равно 1, и где id второго пользователя (fsender_id или ssender_id) не повторяется. Т.е., по представленной таблице, результатом должны быть только строки с id 1 и 6.
  • Вопрос задан
  • 142 просмотра
Решения вопроса 1
@AndryG
Отбираете через where сообщения, где юзер является отправителем или получателем.
Затем группируете " по контрагенту" и с группы выбираете бОльший номер отправления (если вам все же нужны последние, а не первые сообщения).

схема
CREATE TABLE m (
  id INTEGER(11) NOT NULL AUTO_INCREMENT,
  u_from INTEGER(11) NOT NULL,
  u_to INTEGER(11) NOT NULL,
  PRIMARY KEY USING BTREE (id)
) ENGINE=InnoDB
AUTO_INCREMENT=8 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'
;

INSERT INTO `m` (id, u_from, u_to) VALUES
  (1,7,1),
  (2,7,1),
  (3,7,1),
  (4,7,1),
  (5,1,7),
  (6,1,4),
  (7,4,1);
COMMIT;


select
  max(id) id,
  if(u_from = 1, concat('TO ', u_to), concat('FROM ', u_from)) last_msg,
  u_from,
  u_to
from m
where u_from = 1 or u_to = 1
group by if(u_from = 1, u_to, u_from)
order by id
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `user_id`, MAX(`id`)
  FROM (
    SELECT `id`, `fsender_id` AS `user_id`
      FROM `messages`
      WHERE `ssender_id` = :iserId
    UNION SELECT `id`, `ssender_id`
      FROM `messages`
      WHERE `fsender_id` = :iserId
  ) AS `t`
  GROUP BY `user_id`
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы