1

ユーザー データベースでクエリを実行しようとしていますが、ちょっとした問題が発生しています。関連する行の数を取得し、それに基づいて条件を設定したいと考えています。私のシナリオを説明しましょう:

ユーザーは私のアプリで have_many のビデオを使用できます。私の場合、動画を持っていないすべてのユーザーを返したいと考えています。他にもいくつかの条件がありますが、これは私が問題を抱えているものです。私のクエリは、理想的には次のようなものになります(一種のsudo-code):

SELECT count(*) FROM users 
JOIN videos ON users.id=videos.user_id
WHERE
  users.some_attribute = 1
  OR
  (users.last_login >= '03/18/2012' AND COUNT(videos) > 0)

ありとあらゆる助けをいただければ幸いです。

ありがとう!!- ジェフ

4

4 に答える 4

0
SELECT u.user FROM users u
LEFT JOIN videos v ON u.id=v_id
WHERE v_id IS NULL AND 
  (users.some_attribute = 1
  OR
  users.last_login >= STR_TO_DATE('03/18/2012', '%m/%d/%Y'))
于 2013-03-18T17:52:25.340 に答える
0

Not Exists が一番うまくいくと思う

SELECT count(*) 
FROM users 
WHERE
users.some_attribute = 1
OR
(users.last_login >= '03/18/2012' 
and not exists 
 (
 select count(videos.videofield) 
 from videos 
 where users.id=videos.user_id
 )
)
于 2013-03-18T17:50:08.050 に答える
0

GROUP BY を HAVING 属性で使用できます

SELECT usercolumns, count(videos.user_id) 
FROM users 
    LEFT OUTER JOIN videos ON users.id=videos.user_id
WHERE users.some_attribute = 1
GROUP BY usercolumns HAVING users.last_login >= '03/18/2012' AND COUNT(videos.user_id) > 0

本当にすべての列が必要な場合は、サブクエリを使用することもできます

SELECT *
FROM (
    SELECT userscolumns, count(videos.user_id) 
    FROM users 
        LEFT OUTER JOIN videos ON users.id=videos.user_id
    WHERE users.some_attribute = 1
    GROUP BY userscolumns
) A
WHERE users.last_login >= '03/18/2012' 
AND COUNT(videos.user_id) > 0
于 2013-03-18T17:45:11.647 に答える
0

SQL で having ステートメントを使用できます。

SELECT count(*) FROM users 
JOIN videos ON users.id=videos.user_id
WHERE  users.some_attribute = 1   OR   users.last_login >= '03/18/2012'
HAVING COUNT(videos.<some_column>) > 0)

以下のコメントに応じて編集を追加します。

SELECT count(*) FROM users 
WHERE  users.some_attribute = 1   
UNION 
SELECT count(*) FROM users 
JOIN videos ON users.id=videos.user_id
WHERE  users.last_login >= '03/18/2012'
HAVING COUNT(videos.<some_column>) > 0)
于 2013-03-18T17:46:14.040 に答える