1

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

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
4

1 回答 1

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

于 2013-03-07T11:33:34.967 回答