0

データベースから値を選択しようとしていますが、別のデータベースで別の値を確認する必要があります。

このコードを作成しましたが、結果が1つしかなく、理由がわかりません。

SELECT `id` FROM `mc_region` 
    WHERE `is_subregion` = 'false' 
        AND lastseen < CURDATE() - INTERVAL 20 DAY 
        AND (SELECT id_region FROM mc_region_flags 
                    WHERE flag <> 'expire' 
                    AND id_region = mc_region.id
            ) 
LIMIT 0, 30

私が間違ったことは何ですか?

@編集
このコードが機能しない理由はわかっていると思います。データベースmc_region_flagsでは、プライマリデータベースのすべてのレコードにフラグがあるわけではありません。

私は次のことをしたいと思います:

1ºサブリージョンではなく、最後に表示されたのが20日を超える最初のデータベースのすべてのレコードを選択します。2º最初のデータベースの
結果に「有効期限」のフラグがあるかどうかを確認します。ある場合は、結果に含まれません。

1つのSQLコードだけでこれを行うことはできませんか?

@ Edit2

シミュレートするこのコードを作成しましたが、機能しないFULL JOINようですWHERE

SELECT *
    FROM mc_region AS r RIGHT OUTER JOIN
         mc_region_flags AS f ON r.id = f.id_region
UNION ALL
    SELECT * from 
        mc_region AS r LEFT OUTER JOIN 
        mc_region_flags AS f
        ON r.id = f.id_region
WHERE r.is_subregion = 'false' 
AND f.flag = 'exipre' 
AND r.lastseen < CURDATE() - INTERVAL 20 DAY

動作しない問題

  1. f.flag「有効期限」ではありません
  2. f.lastseen20日を超えていない

結果

4

2 に答える 2

0

内側のネストされたselectの前にadd:id in(select ...)

于 2013-01-27T00:57:01.907 に答える
0

更新しました

SELECT * 
  FROM `mc_region` AS r LEFT JOIN 
       `mc_region_flags` AS f ON r.`id` = f.`id_region`
 WHERE r.`is_subregion` = 'false' AND 
       r.`lastseen` < CURDATE() - INTERVAL 20 DAY AND
       COALESCE(f.`flag`, '-') <> 'expire'
LIMIT 0, 30;
于 2013-01-27T01:01:41.427 に答える