1

私のデータベースには、RepliesとThreadsの2つのテーブルがあります。

ユーザーが開始または返信したスレッドを表示する投稿ページを作成しようとしています。

返信の中には、返信先のスレッドのIDを指定する「ThreadId」と「Poster」があり、Threadsの各行には「Poster」列だけでなくId列もあります。

ユーザーが投稿または投稿したすべてのスレッドの行を取得するためのクエリを作成しようとしています。

例:

$myUsername = "Bob";
$q = mysql_query("SELECT * FROM `Threads` WHERE `Poster`='$myUsername'
OR (another query to find if they had a row in Replies matching `ThreadId`='$tid'
AND `Poster`='$myUsername')");

ありがとう

4

4 に答える 4

0

私はこれを別の方法で行いました。提供された2つのクエリは重複を返しましたが、そうではなかったので、もう少し長い道のりを進むことにしました。

私がしたこと:

1)ユーザーの各返信を確認し、スレッドIDを取得します

2)これらのIDを使用してクエリ文字列を作成します(例: "OR Id = $ threadId OR Id = $ threadId2"など)。

3)クエリ文字列をSELECT * FROM Threads WHERE Poster = $ user$queryString2などのスレッドクエリに入れます

4)解決策。:)

于 2012-06-01T16:33:23.913 に答える
0

これを試して:

IN演算子の代わりにLEFT OUTER JOINを使用できます

SELECT T.* 
FROM Threads T 
LEFT OUTER JOIN Replies R ON T.Id = R.ThreadId AND R.Poster = $myUsername
WHERE T.Poster = $myUsername OR R.Id IS NOT NULL
于 2015-01-05T11:04:15.163 に答える
0

Christina のソリューションを使用しても、おそらく非常に効率的なクエリにはなりません。以下はより良いはずです:

SELECT * 
FROM Threads t1
WHERE t1.Poster='$myUsername'
UNION
SELECT *
FROM Threads t2
INNER JOIN replies r
ON t2.id=r.thread_id
WHERE t2.Poster<>'$myUsername'
AND r.Poster='$myUsername';

でも:

1) スレッド テーブルのすべての列が本当に必要ですか? にしても、「*」を使うのはめんどくさい

2) ユーザーが複数の返信を行った場合でも重複が発生しますが、'*' を使用している間はこれを修正できません。

3)両方のテーブルのポスターにインデックスがない場合、大量のデータでもクエリは遅くなります。

于 2012-06-01T09:52:45.257 に答える
0

IN 句を使用して、スレッド ID が返信テーブルのクエリによって返されるものに含まれるように指定する必要があります。このようなものは、テーブルの構造を正しく理解しています。

SELECT * FROM Threads WHERE Poster = $myUsername OR Id IN (
SELECT ThreadId FROM Replies WHERE Poster = $myUsername
)
于 2012-06-01T09:05:05.577 に答える