За последние 24 часа нас посетил 45251 программист и 1811 роботов. Сейчас ищут 764 программиста ...

Выбрать 5 последних неповторяющихся строк по 5 значениям

Тема в разделе "MySQL", создана пользователем justc, 2 окт 2015.

  1. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    Доброго времени суток!

    Есть поле pages, туда помещаются данные в виде "33, 40, 39"
    у каждой строки в pages количество может быть любое и значения могут повторяться, то есть

    строка1 pages = "33, 40, 39"
    строка2 pages = "47, 34"
    строка3 pages = "33, 42, 38, 34"
    ...

    мне нужно выбрать 5 последних неповторяющихся строк по 5 значениям
    то есть
    с значением 40
    с значением 47
    с значением 33
    с значением 37
    с значением 57


    сложно объяснить точнее
    WHERE (pages LIKE '%"40"%' OR pages LIKE '%"47"%' OR pages LIKE '%"33"%' OR pages LIKE '%"37"%' OR pages LIKE '%"57"%') GROUP BY id ORDER BY date DESC LIMIT 0,5

    подобный запрос выведет 5 строк, но в них не будет всех нужных 5 значений (как в примере выше)

    как это можно реализовать?
     
  2. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    придумал только сделать 5 запросов типа
    WHERE (pages LIKE "%40%" AND pages NOT LIKE "%33%" ...)
    и так по каждому запросу

    может можно красиво в один запрос объединить?
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    лайками такое не делается в любом случае. нужно менять структуру бд.
     
  4. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    А как делается? Как делают теги, категории?
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Например, хочу чтобы у сообщения были теги.

    1. таблица тегов
    2. таблица сообщений
    3. таблица где номер сообщения и номер тега
     
  6. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    а в таблице сообщений будет поле тегов?
    я хочу логику понять, смысл то все равно тот же? у каждого сообщения может быть произвольный набор тегов?
    и как выбрать тогда 5 разных сообщений по 5 тегам?
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    justc прочитай про MySQL JOIN
     
  8. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    я думаю все-таки задача не совсем тривиальная
    нужно выбрать 5 разных материалов по 5 разным тегам в одном запросе, так реально вообще?
    ну чтобы материалы не повторялись это легко, но вот чтобы материалов было 5 и каждый под нужный тег?

    Добавлено спустя 3 минуты 2 секунды:
    denis01, да, я уже понял смысл
    но мой вопрос это не решает

    хоть с LIKE, хоть с нормальной структурой
     
  9. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    разбей задачи на более простые, теги через join сделал?

    Добавлено спустя 6 минут 45 секунд:
    Ещё лучше напиши зачем тебе 5 случайных записей, может есть другие решения.
    Случайные выборки очень много ресурсов потребляют.
    http://hudson.su/2010/09/16/mysql-optimizaciya-order-by-rand/
     
  10. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    сделал через 5 запросов, иначе никак
    а чем плох LIKE ?

    если мне нужно искать строки с определенным словом
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    во-первых, ты не решил задачу. твой лайк '%47%' сработает и на слово '847' и на '99947999'. остальное уже не важно

    SQL предназначен для работы с множествами, а для обработки текстов. нормальный подход, когда твои слова-теги оформлены как записи в отдельной таблице, по одной записи на каждое "слово".
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не используются индексы.
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вообще-то вроде используются но для явно указанного начала строки
     
  14. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0