$in_str = 'files/test/Test! symbol # and % and & and (=-,.).pdf';
$out_str = implode('/', array_map('rawurlencode', explode('/', $in_str)));
file_put_contents('test_url.txt', $out_str);
// test_url.txt
// files/test/Test%21%20symbol%20%23%20and%20%25%20and%20%26%20and%20%28%3D-%2C.%29.pdf
SELECT * FROM `products`
LEFT JOIN (SELECT `product`, `price`,
row_number() over (partition by `product` order by `id` desc) as price_rank
from `prices`) as prc on `products`.`id` = prc.`product`
and prc.price_rank = 1
limit 10
SELECT * FROM `products`
LEFT JOIN (SELECT `product`, `price`,
IF(@prev_id <> `product`, @p_rank := 0, @p_rank),
@prev_id := `product`,
@p_rank := @p_rank + 1 as price_rank -- определяем partition
from `prices`,
(SELECT @p_rank := 0) p_rank, -- начальное значение ранга
(SELECT @prev_id := -1) prev_id -- начальное значение товара (не должен быть в диапазоне сущ. id)
order by `product` asc,
`id` desc -- устанавливаем сортировку partition
) as prc on `products`.`id` = prc.`product`
and prc.price_rank = 1
limit 10
SELECT images.name,
GROUP_CONCAT(tags.tagname SEPARATOR ", ") AS tagname,
category.title,
a.category_tagname
FROM images
INNER JOIN images_tags ON images.id = images_tags.images_id
INNER JOIN tags ON images_tags.tags_id = tags.id
INNER JOIN category ON images.category_id = category.category_id
---------------------
join (SELECT category.category_id,
GROUP_CONCAT(tags.tagname SEPARATOR ", ") AS category_tagname
FROM images
INNER JOIN images_tags ON images.id = images_tags.images_id
INNER JOIN tags ON images_tags.tags_id = tags.id
INNER JOIN category ON images.category_id = category.category_id
GROUP BY category.category_id
) a on a.category_id = images.category_id
----------------------
WHERE images.category_id = 1
GROUP BY images.name, category.title, a.category_tagname
Или взять полученный массив $arrTable вытащить оттуда $arrTable[tagname], пересобрать, почистить от дубликатов и выводить уже его?
select g.id_group, cg.id_client, g.group_name
from groups as g
join clients_groups as cg on g.id_group = cg.id_group
if(существует файл кеша и его время изменения меньше 30 мин)
{
// читать кеш
}
else
{
// запросить новые данные и записать файл
}