我试图编写一个获取title,url_title,类别的MYSQL查询,并设置一个URL字段,其值基于类别列的值。
我需要做的是检查管道分离的类别列(例如:10 | 122 | 40 | 187),并将URL列的值设置为http://www.mydomain.tld,如果categories列,则附加url_title包含类别10,40,80 else如果列中不存在这些类别,则将URL设置为http://www.mydomain2.tld并附加url_title。
我试图在下面使用条件,但我显然做错了;
SELECT exp_channel_data.entry_id AS entry_id, exp_channel_titles.title AS title, exp_channel_titles.url_title AS url_title, GROUP_CONCAT(cp.cat_id SEPARATOR '|') AS categories,
IF('122,123,124,125,126,127,128,129,130,131,132,187' IN categories,
(CONCAT('http://www.mydomain.tld',url_title AS 'URL')),
(CONCAT('http://www.mydomain2.tld',url_title AS 'URL'))
)
FROM data
FROM exp_channel_data
LEFT JOIN exp_channel_titles ON exp_channel_titles.entry_id = exp_channel_data.entry_id
LEFT JOIN exp_category_posts AS cp ON exp_channel_data.entry_id = cp.entry_id
这是表结构;
exp_channel_data
-------------
entry_id int 10
exp_channel_titles
-------------
entry_id int 10
title varchar 100
url_title varchar 100
exp_category_posts [this is the junction table that has been referred to]
-------------
entry_id int 10
cat_id int 10
我很感激任何建议。
更新:我已将查询更新为我正在使用的内容。我试图简化问题,但意识到这是一个巴迪达。我还包括了上面的表结构。
答案 0 :(得分:0)
因为你有一个糟糕的数据结构,你必须采用相当强力的方法来做到这一点:
select title, url_title, categories,
(case when find_in_set(122, replace(categories, '|', ',')) > 0 or
find_in_set(123, replace(categories, '|', ',')) > 0 or
. . .
find_in_set(187, replace(categories, '|', ',')) > 0
then CONCAT('http://www.mydomain.tld', url_title AS 'URL')
else CONCAT('http://www.mydomain2.tld', url_title AS 'URL')
end)
FROM data;
您应该在联结表中存储类别,每个类别和实体只有一行。