我正在尝试编写一个MYSQL查询,该查询获取title、url_title和categories,并根据categories列的值设置一个URL域。
我需要做的是检查以管道分隔的Categories列(例如: 10|122|40|187),如果categories列包含类别10、40、80,则将URL列的值设置为http://www.mydomain.tld并附加url_title,否则如果列中不存在这些类别,则将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如果有任何建议,我将不胜感激。
更新:我已经将查询更新为我正在使用的查询。我试着简化这个问题,但我意识到这是一个胡言乱语。我还包括了上面的表结构。
发布于 2014-09-24 19:06:35
因为你有一个糟糕的数据结构,所以你必须使用一种相当暴力的方法来做到这一点:
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;您应该在连接表中存储类别,每个类别和实体占一行。
https://stackoverflow.com/questions/26015244
复制相似问题