1

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

user          messages
+---------+   +----------------+
|id|credit|   |id|user_id| ... |
+---------+   +----------------+
|01| 05   |   |01| 01    | ... |
|02| 01   |   |02| 01    | ... |
|03| 00   |   |03| 01    | ... |
+---------+   |04| 02    | ... |
              |05| 02    | ... |
              |06| 03    | ... |
              +----------------+

n =user.creditのメッセージからn 個のメッセージを選択する必要があります。次のようなクエリを実行したいクエリ:

SELECT * 
FROM user u JOIN messages m ON u.id = m.user_id LIMIT u.credit 
WHERE user in ...;

行 01、02、03、04 を返す必要がありますが、05、06 は返しません。

私は書くことができないことを知っていますLIMIT u.creditが、その動作が必要であり、各ユーザーが持っているクレジットの値の関数でフェッチされるメッセージの数を制限します (ユーザー 01 は制限が 5、ユーザー 02 は制限が 1 など)。ユーザーごとに COUNT を実行してから SELECT を実行する必要がないように、すべてのメッセージを一度に取得したいと考えています。

InnoDB で MySQL を使用しています

4

3 に答える 3

4

これは、変数を使用しないプレーン SQL のソリューションです。

select user.*, messages.*
from user inner join messages
     on user.id=messages.user_id
where (select count(*) from messages m
       where m.user_id=user.id
       and m.id<messages.id)<user.credit

デモ

于 2013-01-09T17:55:44.917 に答える
1

これは遅くなると思います:

SELECT u.*
     , m.*
FROM 
    user AS u 
  JOIN
    ( SELECT m1.*, COUNT(*) AS cnt
      FROM messages m1
        JOIN messages m2
          ON  m2.user_id = m1.user_id 
          AND m2.id <= m1.id
      GROUP BY m1.user_id, m1.id 
    ) m 
      ON  m.user_id = u.id 
      AND m.cnt <= u.credit ;

デモ

于 2013-01-09T18:07:33.820 に答える
0

あなたが決心しているなら、SQLでそれを行う方法があります。

SELECT u.* 
FROM user u JOIN messages m ON u.id = m.user_id
  inner join user u2 on u2.id <= u.id
WHERE user in ...
GROUP BY u.id
HAVING count(u2.id) < u.credit
于 2013-01-09T17:54:52.327 に答える