さて、私は自分のウェブサイトにニュースフィードを持ちたいと思っています。Users、Follow、および Posts という名前の 3 つのテーブルがあります。基本的なユーザー データは Users テーブルに格納され、誰が誰をフォローしているかは Follow テーブルに保存され、ユーザーの投稿はすべて Posts に格納されます。これで、データベース テーブルからすべての投稿を選択し、WHERE 句を使用して制限する方法がわかりました。しかし、フォローしているユーザーのみからすべての投稿を選択し、DESC 日付で表示するクエリをどのように記述すればよいでしょうか? ありがとう。
2 に答える
これが一般的なレイアウトです。あなたが言及したように3つのテーブルを作成します。例として以下に概説します
[テーブル]
- ユーザー
- フォロワー
- 投稿
users テーブルには、少なくとも userid (自動増分値/主キー) のような列が必要です。
フォロワー テーブルには、users テーブルの userid に一致する userid のようなものが必要です。followid 列には、users テーブルのフォロワーの ID # も含まれます。
次に、投稿テーブルにはユーザーIDも必要なので、各投稿が作成されると、ユーザーテーブルのIDが取得されます。
次に、次のようなことをする必要があります。
SELECT p.*
FROM posts AS p
WHERE p.userid IN (SELECT followid FROM followers WHERE userid = ###)
ORDER BY p.date DESC
これを理解するには、ユーザーIDをどのように取得しているかに大きく依存します。Facebook などのログイン後にセッションを使用してユーザー ID を渡す場合、userid = ### を userid = ".$_SESSION['userid']." のように変更できます。しかし、これもユーザー ID をどのように渡すかによって大きく異なりますが、上記は少なくともある程度は開始できるはずです。
テーブルが大きくなったときにすばやく結合できるように、userid、followid 列にインデックスを配置してください。
@Shaneの答えに代わるものは、JOIN演算子を使用することです:
'SELECT p.* // I prefer to name all the fields, but for brevity's sake I'll use the shorthand
FROM Posts AS p
INNER JOIN Follow AS f ON p.userid = f.followid
WHERE f.userid = '.$selectedUserID.'
ORDER BY p.date DESC;'
入力されたユーザー ID ($selectedUserID) について、フォローしているユーザーのすべてのユーザー ID を検索し (フォロー ID をフォロー x-ref テーブルのユーザー ID に一致させます)、投稿テーブルからそれぞれの投稿を降順で検索します。日にち。誰もフォローしていない場合、またはフォローしているユーザーに投稿がない場合は空になります。
また、データベースへの入力をサニタイズし、出力を Web にエスケープすることを思い出させる必要がないことを願っています。
これはあなたが探しているものですか?