2011-11-10 8 views
0

調査を少し行い、ログDBに対してクエリを作成します。MySQLクエリの支援 - 省略、グループ化?

私は必要なデータを取り戻すためにいくつかのテーブルに参加しましたが、それを少しきれいにしたいと思います。

このクエリは、すべてのユーザーとアカウントで有効にした機能を返します。ここで

は、私はそれをクリーンアップするために何をしようとしているです:

2つの状態を有している[アクション]という列が自分で、「追加」と「削除」

ユーザー機能の場合'削除済み'というアクションがある場合、そのユーザーの同じ機能の行が表示されず、「追加済み」とマークされます。

これは可能ですか?ここで

は、私がこれまで持っているものである:すべてのサポートのため

select users.id as site_id, users.company_name, feature_log.featurecode, feature.minimum_account as feature_type, users.account_type as site_type, account_types.name as account, feature_log.action, feature_log.time 
from users 
inner join 
    feature_log 
    on users.id = feature_log.siteid 
inner join 
    feature 
    on feature_log.featurecode = feature.featurecode 
inner join account_types 
    on users.account_type_INC = account_types.id 
where feature.minimum_account != 0 
    AND feature.minimum_account > users.account_type 
    AND users.status = 'Y' 
    ORDER BY feature_log.time DESC 

ありがとう!

+0

'feature_log'テーブルの大きさとは?パフォーマンスはこのクエリのコンテキストで重要ですか? (従属サブクエリや左結合を使用する必要があるかもしれませんが、それは極端に遅いかもしれません) – Romain

+0

8K行程度のパフォーマンスしかありません。調査の対象外となるためパフォーマンスは重要ではありません – adamtor45

答えて

1

ので、与えられたユーザのために、任意の時点で「削除」されているために「ミュート」のすべての機能に、あなたが追加することができます(左)は、次のサブクエリに参加:

SELECT DISTINCT users.id as siteid, feature_log.featurecode, TRUE as mute_feature 
FROM users 
INNER JOIN feature_log ON (users.id = feature_log.siteid) 
WHERE action = 'removed' 

これは、特定の時点で特定のユーザーが無効にした機能のリストになります。次に、あなたのクエリのWHERE句で、あなたはそうのようなフィルタを追加したい:基本的に

AND NOT IFNULL(mute_feature, FALSE) 

、それがあるためにあなたの全体のクエリを持って来ると思います:

select users.id as site_id, users.company_name, feature_log.featurecode, feature.minimum_account as feature_type, users.account_type as site_type, account_types.name as account, feature_log.action, feature_log.time 
from users 
inner join 
    feature_log 
    on users.id = feature_log.siteid 
left join (
    SELECT DISTINCT users.id as siteid, feature_log.featurecode, TRUE as mute_feature 
    FROM users 
    INNER JOIN feature_log ON (users.id = feature_log.siteid) 
    WHERE action = 'removed' 
) as muted_features ON (feature_log.siteid = muted_features.siteid AND feature_log.featurecode = muted_features.featurecode) 
inner join 
    feature 
    on feature_log.featurecode = feature.featurecode 
inner join account_types 
    on users.account_type_INC = account_types.id 
where feature.minimum_account != 0 
    AND feature.minimum_account > users.account_type 
    AND users.status = 'Y' 
    AND NOT IFNULL(mute_feature, FALSE) 
    ORDER BY feature_log.time DESC 
+1

ロマン、 、私はあなたにビールを買っている!ありがとう、これは完全に働いた! – adamtor45

+1

@ adamtor45私はこれを覚えています:)とにかく、これはそれほど難しいことではありませんでした。 – Romain