2017-12-20 12 views
3

これらのステートメントのそれぞれの3行目はまったく同じである。DRY - 格納された関数への繰り返しコードを抽出する方法は?

文1

SELECT * FROM `uploads` 
WHERE `uid` = :uid 
AND `deleted` <> 1 AND `archived` <> 1 

文2

SELECT * FROM `uploads` 
WHERE `folder_id` = :folder_id 
AND `deleted` <> 1 AND `archived` <> 1 

第三のラインは、同様に多くの他の文で使用されています30の異なるステートメントを言うことができます。この例では、「アップロードされたテーブルからすべてのファイルを取得しましたが、削除またはアーカイブされていません」という意味です。将来的に3つ目の修飾子を追加する必要がある場合(たとえばAND uploadsuccess = 1)、30種類の異なるSQL文を編集する必要があります。 DRYしないでください。ここではDRYの原則をSQL(ここではMySQL、それが重要な要素ならば)を使ってどのように使うことができますか?

ありがとうございました。

答えて

3

私はVIEWを使用することをお勧め:

CREATE OR REPLACE VIEW uploads_current AS 
    SELECT * FROM `uploads 
    WHERE `deleted` <> 1 AND `archived` <> 1; 

その後、あなたは追加の条件でそれを照会することができます

SELECT * FROM `uploads_current` 
    WHERE `uid` = :uid; 

あなたが後でビューを再定義することができます。そして、

CREATE OR REPLACE VIEW uploads_current AS 
    SELECT * FROM `uploads 
    WHERE `deleted` <> 1 AND `archived` <> 1 AND uploadsuccess = 1; 

すべてのコードをquerys uploads_currentは暗黙的に同じ条件を含み、コード変更は必要ありません。

ビューの詳細を読む:https://dev.mysql.com/doc/refman/5.7/en/create-view.html

3

これは共通の問題である、我々は、すべてのデータが保存されるようにしたいが、例99%は、我々はデータの特定のサブセットをフィルタリングしています。

私が通常使用する解決策は、ロジックを含むビューを作成し、それに対して照会することです。例:

CREATE VIEW `uploads_view` AS 
SELECT * FROM `uploads` 
WHERE `deleted` <> 1 
AND `archived` <> `; 

SELECT * FROM `uploads_view` WHERE `uid` = :uid; 

SELECT * FROM `uploads_view` WHERE `folder_id` = :folder_id 
+0

はい、私もビューを行います。 –

関連する問題