Php / Mysql:CAST / CASE如果存在row +'_ remove',则不要选择

时间:2013-03-07 11:20:39

标签: php mysql sql casting case

我想在我的查询中包含一个非常具体的CAST/CASE,但我不确定如何执行此操作。这是我的SQL LINE:

SELECT * FROM table WHERE (

         type = 'aaa' OR
         type = 'bbb' OR
         type = 'ccc' OR
         type = 'ddd')

         AND (points NOT LIKE '-%')

         ORDER BY id DESC LIMIT 10

我想要表现的是:

if   : 'type'_remove EXISTS and 'type'->data == 'type'_remove->data
then : Don't select the 'type' row.

示例,以及我想要查询的内容:

id    type          data  points
----------------------------------
1     aaa            1      1     don't select : aaa_remove exists and data are the same
2     bbb            1      3     select       : bbb_remove exists BUT data aren't the same
3     ddd            1     -1     don't select : points IS LIKE '-%'
4     aaa_remove     1     -1
5     ddd            1     -3     don't select : points IS LIKE '-%'
6     bbb_remove     2     -1
7     ccc            1      1     select       : ccc_remove doesn't exists with the same data

1 个答案:

答案 0 :(得分:2)

我建议使用一个名为removed的字段,这会使整个事情变得更容易/更清洁,但如果你有理由,你可以试试这个:

SELECT *
FROM `table` AS `outer`
WHERE
    `outer`.`type` IN('aaa', 'bbb', 'ccc', 'ddd') AND
    `outer`.`points` >= 0 AND
    (
        SELECT `inner`.`id`
        FROM `table` AS `inner`
        WHERE
            `inner`.`type` = CONCAT(`outer`.`type`, '_remove')  AND
            `inner`.`data` = `outer`.`data`
        LIMIT 1
    ) IS NULL
ORDER BY `outer`.`id` DESC
LIMIT 10;

此外,如果您要为多种类型设置相同的基本设置,则只需选择type NOT LIKE '%_remove',而不是列出您想要的所有类型。