• Здравствуйте, уважаемые форумчане!

    Никак не удается правильно сделать выборку из произвольных таблиц БД.

    Суть проблемы:

    Плагин работает со своими таблицами в БД,

    1-я таблица (название syrup_gift), содержит в себе некоторые записи с полями

    id | title | image ….. и т.д.

    2-я таблица (название syrup_gift_th_tags) содержит id записей из первой таблицы (id_gift) + id некого тега

    id | id_gift | id_tag

    Тегов (id_tag) к одной записи может более одного

    id | id_gift | id_tag
    1 | 2 | 17
    2 | 2 | 35
    3 | 2 | 8
    4 | 2 | 12
    5 | 3 | 18
    5 | 3 | 17
    …..

    Как правильно сделать выборку записей из таблицы syrup_gift с учетом того, что запись содержит в себе все переданные в запросе теги? Т.е. например извлечь записи с тегами 17 и 35 (не ИЛИ).

    Пытаюсь сделать так:

    SELECT sg.*
    FROM syrup_gift sg
    LEFT JOIN syrup_gift_th_tags t ON (sg.id = t.id_gift)
    WHERE t.id_tag = 17 AND t.id_tag = 35

    но ответ пустой.

    Если в запросе WHERE оставить только один тег ( WHERE t.id_tag = 17 ), то выборка работает.

    Как правильно выполнить запрос?

    Заранее спасибо за помощь.

    • Тема изменена 5 лет, 10 месяцев назад пользователем rogodessa.
Просмотр 15 ответов — с 1 по 15 (всего 22)
  • так попробуйте
    WHERE t.id_tag IN (17,35)

    или
    WHERE t.id_tag = 17 OR t.id_tag = 35

    Спасибо, но оба варианта не подходят.

    В первом посте я написал, что нужно вернуть записи, которые содержат оба тега (17 и 35), т.е. запись id_gift = 2, т.к. запись id_gift = 3, не содержит 35.

    id | id_gift | id_tag
    1 | 2 | 17
    2 | 2 | 35
    3 | 2 | 8
    4 | 2 | 12
    5 | 3 | 18
    6 | 3 | 17

    IN — проверит, находится ли значение в наборе значений, а значит вернет обе записи, т.к. 17 входит в обе записи
    OR — говорит сам за себя… ИЛИ — вернет обе записи.

    • Ответ изменён 5 лет, 10 месяцев назад пользователем rogodessa.
    • Ответ изменён 5 лет, 10 месяцев назад пользователем rogodessa.
    • Ответ изменён 5 лет, 10 месяцев назад пользователем rogodessa.

    Таблицу syrup_gift_th_tags нужно джойнить саму на себя по столбцу id_gift, столько раз сколько тегов вам нужно найти -1. На джоин наложить ограничения по тегам. Потом джоин с таблицей с постами.

    Ну или можно использовать колхозный вариант, используя оператор IN найти нужные теги в syrup_gift_th_tags потом сгруппировать по посту GROUP BY id_gift и сравнить функцию count() с количеством нужных тегов. Ну и потом как обычно джоин по id с таблицей постов.

    • Ответ изменён 5 лет, 10 месяцев назад пользователем pluginfactory.
    • Ответ изменён 5 лет, 10 месяцев назад пользователем pluginfactory.

    Pluginfactory, спасибо за наводку. Но все решилось более простым способом. HAVING — помог

    SELECT sg.*
    FROM syrup_gift sg
    INNER JOIN syrup_gift_th_tags t ON sg.id = t.id_gift
    WHERE t.id_tag IN (17, 35)
    GROUP BY sg.id
    HAVING COUNT(DISTINCT t.id_tag) = 2

    Кстати, а какое отношение весь этот топег имеет непосредственно к ВП?

    Сайт на WP, работа плагина

    ага, классика:

    <Sashok> — Здравствуйте, это канал об аниме? — Да. — Как мне пропатчить KDE2 под FreeBSD?

    Я про другое, непосредственно к ВП это какое отношение имеет???

    Т.е. вы считаете что запросы к БД типа $wpdb->get_results(«QUERY»); не имею отношения к WP?
    Или функции WP ограничены только тем что есть по дефолту в админке, а расширение функционала только плагинами из репозитория? Если так, то да — это «классика».

    Т.е. вы считаете что запросы к БД типа $wpdb->get_results(«QUERY»); не имею отношения к WP?

    ну ка тыкните пальцем, где тут эта конструкция?

    SELECT sg.*
    FROM syrup_gift sg
    INNER JOIN syrup_gift_th_tags t ON sg.id = t.id_gift
    WHERE t.id_tag IN (17, 35)
    GROUP BY sg.id
    HAVING COUNT(DISTINCT t.id_tag) = 2

    $wpdb->get_results(«QUERY»), QUERY — это и есть запрос

    правильно. Совершенно верно!.
    Т.е. сам топег ни какого отношения непосредственно к ВП не имел.
    точно так же могли ответить и на sql.ru, не правда ли?

    Точно, можете здесь еще модераторов послать на php.ru — https://ru.wordpress.org/support/topic/%D0%BF%D0%BE%D1%80%D1%87%D0%B0-serialize-%D0%B8%D0%B7-%D0%B1%D1%8D%D0%BA%D0%B0%D0%BF%D0%B0/

    Не говорите мне что делать, вместо ответа на прямо поставленный вопрос.
    Как в песочнице «А вон Сережка из первого подъезда…..!»
    За своими поступками следите.

    Я слежу. И не сказал что делать, а предложил. Дискуссию вы развели на ровном месте. Другие участники темы не посчитали мой вопрос не уместным и внесли свои предложения. И еще раз повторюсь, WP непосредственно связан с mysql

    • Ответ изменён 5 лет, 10 месяцев назад пользователем rogodessa.
Просмотр 15 ответов — с 1 по 15 (всего 22)
  • Тема «Помогите правильно составить SQL запрос» закрыта для новых ответов.