Выборка из двух таблиц (сложный запрос)

12
SEOCondition
На сайте с 03.10.2011
Offline
91
1678

Доброй ночи, форумчане! Возможно, кто-то знает, как решить подобную задачу верно.

Есть две таблицы: cats и files

cats содержит поле dir, т..е название папки
files содержит описания файлов

Нужно сформировать запрос, чтобы выбрать из files: title, descr, id, tags

А из cats — только dir

dir - текстовое значение (название папки)

(нужно только для вывода картинки: site.com/images/'_DIR_'/image.png)

Это легко решается, но не при условии наличие LIKE

Суть в том, что вводится запрос, который может быть в поле "tags", если есть совпадение по LIKE, то выводятся уже все данные.

Проблема в том, что, если используется LIKE, то выводит лютый бред (дублируется вывод),. Если делать GROUP BY, то дублирование прекращается, но информация из поля dir для каждого из выведенных файлов становится некорректной (например, у всех одинаковое значение). Зависит от того по какому полю группировать.

Заранее благодарен за ответы!

P.S: другую структуру не рассматриваю, к сожалению.

png cats.png
png files.png
Монетизация, продвижение сайтов [личка]
NothingMatters
На сайте с 12.06.2017
Offline
45
#1

А таблицы как связаны? Покажите describe таблиц.

MT
На сайте с 17.01.2017
Offline
22
#2
SEOCondition:
если используется LIKE, то выводит лютый бред (дублируется вывод),. Если делать GROUP BY

Если Вы напишете здесь эти 2 запроса, то шансы получить верный ответ возрастут многократно.

S3
На сайте с 29.03.2012
Offline
222
#3

Выборку из двух таблиц сложно назвать "сложной"))) При правильной связи му таблицами легко пишется. Покажите структуру таблиц для начала

SEOCondition
На сайте с 03.10.2011
Offline
91
#4

Вот запрос

"SELECT a.id, a.title, a.category, a.date, b.dir FROM files as a, cats as b WHERE `tags` LIKE ('%, ".$tag.", %') OR `tags` LIKE ('%, ".$tag."') OR `tags` LIKE ('".$tag.", %') AND a.category=b.id ORDER BY a.date DESC LIMIT 0,10";

P.S: по поводу структуры, сбросил в первом же посте (обобщенные скрины без деталей). Первый скрин — cats, второй — files

edogs software
На сайте с 15.12.2005
Offline
714
#5
SEOCondition:
Вот запрос
"SELECT a.id, a.title, a.category, a.date, b.dir FROM files as a, cats as b 
WHERE `tags` LIKE ('%, ".$tag.", %') OR `tags` LIKE ('%, ".$tag."') OR `tags` LIKE ('".$tag.", %')
AND a.category=b.id ORDER BY a.date DESC LIMIT 0,10";

P.S: по поводу структуры, сбросил в первом же посте (обобщенные скрины без деталей). Первый скрин — cats, второй — files

Так попробуйте

SELECT a.id, a.title, a.category, a.date, b.dir FROM files as a left join cats as b

WHERE `tags` LIKE ('%, ".$tag.", %') OR `tags` LIKE ('%, ".$tag."') OR `tags` LIKE ('".$tag.", %')

AND a.category=b.id group by a.id ORDER BY a.date DESC LIMIT 0,10

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход.
SEOCondition
На сайте с 03.10.2011
Offline
91
#6
edogs:
Так попробуйте
SELECT a.id, a.title, a.category, a.date, b.dir FROM files as a left join cats as b
WHERE `tags` LIKE ('%, ".$tag.", %') OR `tags` LIKE ('%, ".$tag."') OR `tags` LIKE ('".$tag.", %')
AND a.category=b.id group by a.id ORDER BY a.date DESC LIMIT 0,10

SELECT a.id, a.title, a.version, a.category, b.dir  FROM files as a left join cats as b WHERE tags LIKE ('%, запрос, %') OR tags LIKE ('%, запрос') OR tags LIKE ('запрос, %') AND a.category=b.id group by a.id ORDER BY a.date DESC LIMIT 0,15

Имеем

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHERE tags LIKE ('%, игры, %') OR tags LIKE ('%, игры') OR tags LIKE ('' at line 1 
S
На сайте с 30.09.2016
Offline
459
#7

Ну дык выкиньте скобки и запятые из лайков - может быть и пропадёт ошибка.

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
edogs software
На сайте с 15.12.2005
Offline
714
#8

SELECT a.id, a.title, a.category, a.date, b.dir FROM files as a left join cats as b

on a.category=b.id

WHERE `tags` LIKE ('%, ".$tag.", %') OR `tags` LIKE ('%, ".$tag."') OR `tags` LIKE ('".$tag.", %')

group by a.id ORDER BY a.date DESC LIMIT 0,10

M
На сайте с 04.12.2013
Offline
188
#9

Такого изврата с тегами я никогда не видел.

Делается стандартно присоединением:


... LEFT JOIN `cats` USING(`category`) ...

Хотя обычно строка между /images/ и /тут_картинки_материала соответствует адресу материала, поэтому все необходимые слаги выбираются автоматом, а на конечных страницах материалов можно вообще встраивать в это место канонический адрес материала (без слешей по краям).

Хостинг FOZZY ( http://fozzy.com.ru ) / Выслушаю предложения на домены ( http://u75.ru/domains-for-sale ) / Домены и скрипт для коротких ссылок ( http://u75.ru/domains-for-shortcuts )
vint
На сайте с 06.05.2004
Offline
163
#10

...WHERE (`tags` LIKE '%, ".$tag.", %' OR `tags` LIKE '%, ".$tag."' OR `tags` LIKE '".$tag.". %') AND a.category=b.id ORDER....

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий