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

danneo

Честный
Регистрация
13 Ноя 2007
Сообщения
1.526
Реакции
121
Есть две таблицы:
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 = 'карточка'  )
 
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);
 
Последнее редактирование:
не могу понять, как можно это дело сделать через regexp?
В поле id через запятую... а нужно через "|".
 
Последнее редактирование:
Думаю второй вариант решения предложенный 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
 
Назад
Сверху