Нужна помощь по выборки в MySQL

Тема в разделе "Базы данных", создана пользователем danneo, 6 май 2014.

Модераторы: latteo
  1. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.421
    Симпатии:
    109
    Есть две таблицы:
    dn054_portfolio_tag ( tagid, tagcpu, taword ) - id записи, ЧПУ, кириллица
    dn054_portfolio ( id, title, thumb, tags ) - id, заголовок, картинка, список id через запятую тегов

    Нужно сделать выборку по строке, например, 'Визитки, визитка, карточка'
    Я сформировал строку:
    Код:
    AND ( portfolio_tag.tagword = 'Визитки'  OR portfolio_tag.tagword = 'визитка'  OR portfolio_tag.tagword = 'карточка'  )
    Не могу сообразить, как объединить таблицы.
    В итоге нужно вывести, картинку, название и id заголовка для формирования ссылки на запись.


    Вот что написал (не работает:(
    Код:
    SELECT dn054_portfolio_tag.tagid AS tagid ,
             
       dn054_portfolio.title AS title,
       dn054_portfolio.image_thumb
           
           
         FROM dn054_portfolio_tag
           LEFT JOIN dn054_portfolio
             ON dn054_portfolio_tag.tagid IN(dn054_portfolio.tags )
         WHERE  dn054_portfolio.act = 'yes'
         AND ( portfolio_tag.tagword = 'Визитки'  OR portfolio_tag.tagword = 'визитка'  OR portfolio_tag.tagword = 'карточка'  )
         
            
     
  2. latteo

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

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.405
    Симпатии:
    1.185
    Mysql думает о твоём запросе совсем не то же самое что и ты :)
    Передавая IN(dn054_portfolio.tags ) ты по сути вызываешь IN('2,3,5'), а для корректной работы надо IN('2', '3', '5')

    Можно исправить:
    - указав все теги в таблице dn054_portfolio в разных полях - завести колонки tag1, tag2, tag3 и соответственно джойнить на все 3 или на один из трёх или...
    - сделав дополнительную таблицу portfolio to tags с полями (portfolio_id, tag_id) - в запросе будет 2 join`a
    - познакомиться с Mysql regexp ;) но только если исходные таблицы не слишком раздуты, чем больше записей тем медленнее это будет работать
    - ...
    - попробовать ON FIND_IN_SET(dn054_portfolio_tag.tagid, dn054_portfolio.tags);
     
    Последнее редактирование: 7 май 2014
  3. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.421
    Симпатии:
    109
    не могу понять, как можно это дело сделать через regexp?
    В поле id через запятую... а нужно через "|".
     
  4. latteo

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

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.405
    Симпатии:
    1.185
    Это противоречит тому, что ты писал в первом посте - выложи дамп таблиц.
     
    Последнее редактирование: 8 май 2014
  5. Sciphoshee

    Sciphoshee Писатель

    Регистр.:
    15 май 2014
    Сообщения:
    2
    Симпатии:
    2
    Думаю второй вариант решения предложенный latteo (третья таблица связей между portfolio_id и tag_id) будет вам наиболее удобным, да и более грамотным. Вам будет гораздо проще как искать, так и обновлять/удалять теги, ну и заодно ваша бд будет более нормализованной. А запрос будет что то вроде:

    Код:
    SELECT
    p.id,
    p.title,
    p.image_thumb
    
    FROM
    dn054_portfolio AS p,
    dn054_portfolio_tag AS pt,
    dn054_portfolio_id_to_tag_id AS ptt
    
    WHERE
    pt.tagword IN ('Визитки', 'визитка', 'карточка') AND
    ptt.tagid=pt.tagid AND
    p.id=ptt.portfolio_id