2013-03-07 33 views
1

我想在我的查询中包含一个非常具体的CAST/CASE,但我不确定如何执行此操作。这是我的SQL LINE:Php/Mysql:CAST/CASE如果row +'_remove'存在,那么不要选择

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 

什么我试图perfom是:

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

如果points是一个数字数据类型,那么你只需检查'<0';如果它不是数字,为什么不是? – 2013-03-07 11:23:51

+0

酷!是的点是一个BIGINT(20)所以是的,我打算这么做:) Thinx – hawkidoki 2013-03-07 11:26:13

回答

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'而不是列出所需的所有类型。

+0

认为你哥们!我目前正在测试它 – hawkidoki 2013-03-07 12:17:37

+0

太棒了!它完美的工作!薄型:) – hawkidoki 2013-03-07 12:26:14

相关问题