2012-05-03 12 views
1

where節でselectを実行しようとしています。mysqlのWHERE内でSELECTを実行できますか?

基本的に、私はいくつかのユーザーを持っており、どのユーザーがアクティブであるかを確認しようとしています。アクティブとは、過去30日間にアクティビティを記録したことを意味します。しかし、ユーザーテーブルをアクティビティテーブルに結合すると、重複したユーザーIDが取得されます(各ユーザーが複数のアクションを記録している可能性があるため)。

私は、少なくとも1つのアクションがあったことを各ユーザーごとにチェックする場所を選択することを検討していました。

SELECT u FROM `users` u 
where (
select count(*) FROM `user_activity` ua 
where ua.user_id = u.user_id and ua.last_login between "2012-04-01 00:00:00" and "2012-04-30 23:59:59" 
) >= 1 
+0

はので、ここでの質問は(HTTPあなたが – Satya

+0

に直面している問題は、[明確な]ないはずは何かということですdev.mysql.com/doc/refman/5.0/en/distinct-optimization.html)トリックをやりますか? –

答えて

1
SELECT u 
FROM users u 
where EXISTS (select null 
       FROM user_activity ua 
       where ua.user_id = u.user_id 
       and ua.last_login between "2012-04-01 00:00:00" and "2012-04-30 23:59:59" 
       LIMIT 1) 

潜在的にパフォーマンスビット

+1

相関サブクエリに 'LIMIT 1'を追加するとパフォーマンスが向上しますか? – Ami

+0

@Ami:いいですね。 – zerkms

+0

@zerkmsなぜ 'SELECT'、' LIMIT'、 'FROM'を大文字にしますが、' WHERE'、 'AND'、' BETWEEN'を大文字にしませんか? Odd ... – Flukey

0

はい、あなたが巣そうのように、where句内の選択することができます向上させることができることについてLIMIT 1サブクエリで約指し示す@Amiのおかげ:

SELECT * FROM mytable WHERE users in(SELECT users FROM user_activity); 

しかし、私はcount(*)のような集計関数をwhere節の中に入れ子にすることはできないと思います。だから私はこれを最初にしてから集計関数を試しますが、集計なしで選択を書こうとします。私は私の前にあなたのデータを持っていないので、私はそこでは助けることができません。

0

はい、SELECTをWHERE句に入れることができます。

私はそれがパフォーマンスを改善かどうかを確認するために登録しようと相関副問合せ避けるだろう://:

SELECT DISTINCT `user` 
FROM users u 
JOIN user_activity ua 
    ON ua.user_id = u.user_id 
    AND ua.last_login BETWEEN '2012-04-01 00:00:00' AND '2012-04-30 23:59:59' 
+0

'DISTINCT'はテーブル全体には適用できませんが、' DISTINCT u。* 'は動作します。 PS:OPがアクティビティを持っているユーザーのみを望んでいる場合 - INNER JOINはあなたが書いたものです – zerkms

+0

現在のクエリは 'ERROR 1054(42S22): 'フィールドリスト'に 'u'という未知の列を生成します – zerkms

+0

@zerkms 、ありがとう、私はインナージョインをキャッチした。テーブルの別名 'u'と同じ名前のカラム' u'があるのは不思議ですが、MySQLは不平を言っていませんでした。最初の 'u'は列です。 – Ami

関連する問題