1

クエリに非常に具体的なインクルードがCAST/CASE必要ですが、これを行う方法がよくわかりません。これが私のSQLLINEです:

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 に答える