2

私は3つのテーブルを持っています:

  • ユーザー
  • アイテム
  • user_groups

  • 各ユーザーは複数のアイテムをアイテムテーブルに投稿できます

  • 各ユーザーは、自分が属するユーザーグループを定義するuser_groupsに1つのレコードを持っています(たとえば、新規ユーザー、ジュニアユーザー、シニアユーザー管理者など)。

次の条件を満たすユーザーのIDのリストを取得しようとしています。

  • ユーザーグループ「3」に所属
  • 今日投稿したアイテムは5つ未満です

これが私の質問です:

SELECT u.id, COUNT (i.id) as numPosted
FROM users u, items i
    JOIN user_groups on user_groups.userId = u.id
    AND user_groups.groupId = '5'
 WHERE                          
     i.userId = u.id AND
     i.datePosted = CURDATE() AND                         
     numPosted < 5
  • JOINでは、ユーザーがユーザーグループ5に属していることを確認します。
  • そして、アイテムがuserIdに属していること、および今日投稿されたアイテム、および投稿されたアイテムの数が5未満であることを確認した場所。

このクエリを実行すると、次のエラーが発生します。

#1630 - FUNCTION items.COUNT does not exist. Check the 
'Function Name Parsing and Resolution' section in the Reference Manual

私は何が間違っているのですか?

4

2 に答える 2

4

COUNT、設定groupId = '3'(groupIdが実際にはテキストであると想定)、およびHAVING句の追加の後にスペースを削除します。

SELECT u.id, COUNT(i.id) as numPosted
  FROM users u
       JOIN user_groups g ON (g.userId = u.id AND g.groupId = '3')
       LEFT OUTER JOIN items i ON (i.userId = u.id and i.datePosted = CURDATE())
  GROUP BY u.id
  HAVING COUNT(i.id) < 5

投稿をしなかったユーザーをキャプチャするという問題もあります。ストレート結合すると、それらのユーザーが失われます。そこで外部結合が必要になります。

于 2012-09-15T23:30:28.900 に答える
2

まず、CURDATE()は、00:00:00の暗黙の時刻で現在の日付を返します。したがって、:CURDATE()== "2012-09-16 00:38:16"と言うと、CURDATEは "2012-09-16 00:00:00"であるため、0が返されます。BETWEENステートメントを使用する必要があります:datePosted BEWEEN CURDATE()およびNOW()(これは暗黙的にBETWEEN'2012-09-1600:00:00'および'2012-09-1600:38:16'を示します)。

あなたは試すことができます:

SELECT u.id, COUNT(i.id) as numPosted
FROM users u, items i
JOIN user_groups on user_groups.userId = u.id
AND user_groups.groupId = '3'
WHERE i.userId = u.id
AND i.datePosted BETWEEN CURDATE() AND NOW()
AND numPosted < 5

また、通常の場合とまったく同じ> CURDATE()を使用することもできます。これは、today(curdate)が2012-09-16の場合、その隣のすべてのエントリが今日になるためです(ただし、前のエントリを使用する方が安全です)。外部サービスを使用してデータを回復/挿入する場合、将来的に何かが発生する可能性があるため、クエリを実行します...)

SELECT u.id, COUNT(i.id) as numPosted
FROM users u, items i
JOIN user_groups on user_groups.userId = u.id
AND user_groups.groupId = '3'
WHERE i.userId = u.id
AND i.datePosted > CURDATE()
AND numPosted < 5
于 2012-09-15T22:40:57.203 に答える