我想在我的查询中包含一个非常具体的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
答案 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'
,而不是列出您想要的所有类型。