2014-09-24 65 views
0

我想写一个MYSQL查询获取标题,url_title,类别,并且还设置了一个基于类别值的值的URL字段。与IF条件的MySQL查询

我需要做的是检查管道分离的类别列(例如:10 | 122 | 40 | 187),并将url列的值设置为http://www.mydomain.tld并添加url_title,如果类别列包含类别10 ,如果列中没有这些类别,则返回40,80,然后将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 

我将不胜感激任何意见。

更新:我已更新查询,我正在使用。我试图简化这个问题,但意识到这是一个基准。我还包括了上面的表格结构。

+1

您不应该在列中存储分隔列表。关系数据库有一个伟大的数据类型来存储列表。在这种情况下,它被称为表格,特别是结点表格。 – 2014-09-24 11:03:05

+0

该死的,我粘贴了错误的网址。我的意思是:可能重复[如何匹配逗号分隔的字符串,而不考虑它们在Mysql中的位置顺序](http://stackoverflow.com/questions/25887713/how-can-match-a-string-of-comma - 分隔-不论-的-其位阶/ 25887934#25887934)。 – GolezTrol 2014-09-24 11:06:55

+0

对不起,我应该补充说,这些类别不是以管道分隔的方式存储的。我已将它们连接到查询中的一个字段中。 – doubleplusgood 2014-09-24 11:08:10

回答

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; 

你应该存储类别结合表,每个类别和实体一行。