LIMIT для IN()

Статус
В этой теме нельзя размещать новые ответы.

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
516
Реакции
1.240
Приветствую,

Как сделать лимит для IN?

Есть запрос: SELECT * FROM table WHERE `number` IN (1, 3, 5)

И записи:
id | number
1 | 1
2 | 1
3 | 2
4 | 2
5 | 3
6 | 3

В общем, для каждой IN несколько записей подходит.

А надо чтобы для in(1) - получить 1 запись
для in(3) - еще 1 запись
и для in(5) 1 запись

Всего надо 3 записи, по 1 для каждого IN

+ надо ORDER BY `table`.`id` DESC
 
А это и не через LIMIT делается. Добавь Для просмотра ссылки Войди или Зарегистрируйся в select или Для просмотра ссылки Войди или Зарегистрируйся в конец (но перед ORDER BY)
Ничего не помогло.

В общем, при выводе диалогов надо по последнему сообщению к ним вывести. К каждому диалогу по 1 сообщению.

Запрос:
Код:
SELECT DISTINCT `dialog_id`, `message`, `id`, `time` FROM `messages` WHERE `dialog_id` IN (1, 2) ORDER BY `id` DESC
и
Код:
SELECT * FROM `messages`  WHERE `dialog_id` IN (1, 2) GROUP BY `dialog_id` ORDER BY `id` DESC

В первом случае для 1 диалога возвращается больше чем 1 сообщение.
Во втором самое первое сообщение, а не последнее

Таблица: Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
У меня все получается Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся не работает :)

Получает id 1, а должен 2

А для dialog_id = 2 будем считать сообщений нет


И у вас не работает. У вас должны быть ID: 6, 4, 2. А у вас 5, 3, 1
 
Последнее редактирование:
И у вас не работает. У вас должны быть ID: 6, 4, 2. А у вас 5, 3, 1
Если в лоб, то как-то так:
PHP:
SELECT ordered.* FROM (
 SELECT * FROM test WHERE `number` IN (1, 2, 3) ORDER by `id` DESC
) as ordered  GROUP BY ordered.`number` ORDER by ordered.`number` DESC
Для просмотра ссылки Войди или Зарегистрируйся

Но за скорость выполнения на больших таблицах ничего не скажу :(
Как минимум стоит добавить индекс по number
 
Не сработало :(

Дело в том, что на sql fiddle запрос работает, а в моей бд нет.

Вот на sql fiddle: Для просмотра ссылки Войди или Зарегистрируйся

Моя таблица: Для просмотра ссылки Войди или Зарегистрируйся
И результат: Для просмотра ссылки Войди или Зарегистрируйся

У меня получает id 1, а на sql fiddle id 2

PS. GROUP BY ordered.number мне не надо.
 
@Q_BASIC, сделай EXPLAIN, давай сравним Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся

Моя бд:
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
 
@Q_BASIC, похоже у тебя на сервере Mysql 5.7 который немного иначе обрабатывает подзапросы Для просмотра ссылки Войди или Зарегистрируйся
Попробуй вот так:
Код:
CREATE VIEW `ordered` AS SELECT * FROM `mt_messages` WHERE `dialog_id` IN (1, 2) ORDER BY `id` DESC;
SELECT * FROM `ordered` WHERE 1=1 GROUP BY `dialog_id`;
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху