带有IF条件的MySQL查询

时间:2014-09-24 11:01:13

标签: mysql sql

我试图编写一个获取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

我很感激任何建议。

更新:我已将查询更新为我正在使用的内容。我试图简化问题,但意识到这是一个巴迪达。我还包括了上面的表结构。

1 个答案:

答案 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;

您应该在联结表中存储类别,每个类别和实体只有一行。