3

したがって、ユーザー、投稿、プライベート、スレッドの 4 つのテーブルがあります。この例では、lizzy は異なるスレッドに 2 つの非公開投稿を作成しました。

「デート」投稿は、ユーザー 2、5、6 および彼女自身がそのスレッド内の投稿の正確な数を確認するためのものです。

「Break Ups」の投稿は、ユーザー 2 と彼女自身がそのスレッドの投稿の正しい数を確認するためのものです。

スレッドを表示しているユーザーに応じて正しいカウントを表示することが、私が抱えている問題です。ここでは、リジー、彼女のスレッド、および投稿数に注目しています。

users                     (These aren't part of table. Just shows the counts we should display with our query depending on the user_id)
user_id |  user_name      //thread #: post_count-post_count_if_not_authorized = count to show 
--------------------
   1    |    tony         //thread 2: 3-1= 2 posts. thread 3: 2-1= 1 post.
   2    |    steph        //thread 2: 3-0= 3 posts. thread 3: 2-0= 2 posts.
   3    |    lizzy        //thread 2: 3 posts. thread 3: 2 posts.
   4    |    adam         //thread 2: 3-1= 2 posts. thread 3: 2-1= 1 post.
   5    |    lara         //thread 2: 3-0= 3 posts. thread 3: 2-1= 1 post.
   6    |    alexa        //thread 2: 3-0= 3 posts. thread 3: 2-1= 1 post.


posts
post_id   thread_id   user_id   post_name   private (0 is public, 1 is private to authorized users)
-----------------------------------------------------
   1         1           1       Coding        0
   2         2           3       Dating        1
   3         2           3       Show Me       0
   4         2           3       See Me        0 
   5         3           3       Break Ups     1
   6         3           3       True Love     0

private
private_id   post_id   authorized_user_id
-----------------------------------------------
    1           2               2
    2           2               5
    3           2               6
    4           5               2

threads
thread_id  user_id  post_count
------------------------------------
    1         1         1
    2         3         3  | When outputted in php, we should subtract the correct COUNT
    3         3         2  | from this depending on the user viewing the thread like above.

つまり、基本的に、そのスレッド内のすべての投稿の合計スレッド数があります。しかし、mysql クエリでそれを引き出すと、すべてのユーザーは、彼女が持っているスレッドごとにすべての lizzy の post_count を見ることになりますが、代わりに、lizzy と、スレッド上の特定の投稿を表示することを彼女が許可したすべてのユーザーだけが、表示されている非公開の正しいカウントを参照する必要があります。彼ら。カウントを行 (post_count_if_not_authorized) として引き出して、post_count から減算して、各ユーザーに正しいカウントのみを表示する最も効率的な方法は何でしょうか?

以下のようなものは私が求めているものです(もちろんそのままでは機能しません):

SELECT DISTINCT t.thread_id, t.post_count, t.COUNT(*)
FROM threads as t
JOIN posts as p on p.user_id = t.user_id
LEFT JOIN private pv on pv.post_id = p.post_id
WHERE t.user_id='3'
    AND (p.private = 0) OR (pv.authorized_user_id = {$logged_in_id} and p.private = 1)

アップデート:

(WHERE 句の t.user_id='3' は、この例では lizzy 用であり、$logged_in_id が上記のユーザー テーブルのカウントのように、ユーザーに応じて正しいカウントを与える必要がある場合)

ここにフィドルがあります。

tony ($logged_in_id=1) が lizzy (user_id=3) の開始スレッドを表示している場合、出力は次のようになります。

thread_id    post_count_final (this should have the correct count for this user($logged_in_id) to see, all posts by lizzy - private posts by lizzy that this user is not authorized to see)
    2            2
    3            1

steph ($logged_in_id=2) が lizzy (user_id=3) の開始スレッドを表示している場合:

thread_id    post_count_final (this should have the correct count for this user($logged_in_id) to see, all posts by lizzy - private posts by lizzy that this user is not authorized to see)
    2            3
    3            2

(注: users テーブルの横にある右上の部分は、これらの数値がどのように導き出されたかを示しています。)

4

2 に答える 2

2
SELECT 
t.thread_id, t.post_count, 
COUNT(IF(ISNULL(pv.private_id) AND p.private='1' AND p.user_id<>'1', null, 1)) 
FROM threads as t
JOIN posts as p on p.thread_id = t.thread_id 
JOIN users as u on u.user_id = p.user_id 
LEFT JOIN private as pv on pv.post_id = p.post_id AND pv.authorized_user_id='1' 
JOIN users as auth on auth.user_id = '1'
WHERE p.user_id='3' AND t.user_id='3'
GROUP BY t.thread_id;

これは、(ログインしている) lizzy が lizzy を表示している場合でも機能するはずです。COUNT(*) を追加すると、t.post_count と同じ値が返されます。クエリはより重くなりますが、threads テーブルの使用を完全に排除し、クエリでカウントをまとめて行うことができます。

于 2013-02-07T00:12:09.133 に答える
0

適切なgroup by構文を使用すれば、機能しますか?

SELECT t.thread_id, t.post_count, COUNT(*)
FROM threads as t
JOIN posts as p on p.user_id=t.user_id 
LEFT JOIN private pv on pv.post_id=p.post_id
WHERE (p.private=0) OR (pv.authorized_user_id={$logged_in_id} and p.private=1) 
group by t.thread_id, t.post_count
于 2013-02-04T20:32:07.133 に答える