LIMIT для IN()

Тема в разделе "Базы данных", создана пользователем Q_BASIC, 15 окт 2016.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    452
    Симпатии:
    1.159
    Приветствую,

    Как сделать лимит для 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
     
    dana77 нравится это.
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.589
    Симпатии:
    1.497
    А это и не через LIMIT делается. Добавь DISTINCT в select или GROUP BY в конец (но перед ORDER BY)
     
    Q_BASIC нравится это.
  3. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    452
    Симпатии:
    1.159
    Ничего не помогло.

    В общем, при выводе диалогов надо по последнему сообщению к ним вывести. К каждому диалогу по 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 сообщение.
    Во втором самое первое сообщение, а не последнее

    Таблица: http://prnt.sc/culo68
     
    Последнее редактирование: 15 окт 2016
    dana77 нравится это.
  4. CAPAXA

    CAPAXA

    Регистр.:
    7 июн 2007
    Сообщения:
    960
    Симпатии:
    569
    Q_BASIC нравится это.
  5. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    452
    Симпатии:
    1.159
    http://sqlfiddle.com/#!9/4112f2/1 не работает :)

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

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


    И у вас не работает. У вас должны быть ID: 6, 4, 2. А у вас 5, 3, 1
     
    Последнее редактирование: 15 окт 2016
    dana77 нравится это.
  6. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.589
    Симпатии:
    1.497
    Если в лоб, то как-то так:
    PHP:
    SELECT ordered.* FROM (
     
    SELECT FROM test WHERE `numberIN (123ORDER by `idDESC
    ) as ordered  GROUP BY ordered.`numberORDER by ordered.`numberDESC
    http://sqlfiddle.com/#!9/2d5cb5/8

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

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    452
    Симпатии:
    1.159
    Не сработало :(

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

    Вот на sql fiddle: http://sqlfiddle.com/#!9/4112f2/3

    Моя таблица: http://prnt.sc/cuxq1s
    И результат: http://prnt.sc/cuxqdm

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

    PS. GROUP BY ordered.number мне не надо.
     
    dana77 нравится это.
  8. antonixus

    antonixus Постоялец

    Регистр.:
    18 июл 2016
    Сообщения:
    54
    Симпатии:
    36
    Q_BASIC нравится это.
  9. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    452
    Симпатии:
    1.159
    dana77 нравится это.
  10. antonixus

    antonixus Постоялец

    Регистр.:
    18 июл 2016
    Сообщения:
    54
    Симпатии:
    36
    @Q_BASIC, похоже у тебя на сервере Mysql 5.7 который немного иначе обрабатывает подзапросы http://mysqlserverteam.com/derived-tables-in-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`;
     
    Q_BASIC нравится это.
Статус темы:
Закрыта.