2

友人と私からの最新の投稿を表示するスクリプトを作成しようとしています。これに関連する 3 つのテーブルがあります - statusUpdates (投稿を含む)、friends (ID を使用した友人間のリンク)、users (Web サイトのすべてのユーザーの詳細を含む)。現時点で使用しているスクリプトは次のとおりです。

$myQuery = mysql_query ("SELECT * FROM statusUpdates AS su 
             LEFT JOIN (friends AS fr) ON
                (fr.frHostID = su.authorID OR fr.frContactID = su.authorID) 
             WHERE (fr.frHostID = 105090)
             GROUP BY su.statusID
             ORDER BY su.statusID
             DESC LIMIT 0,5");

105090 は私自身の ID です。

問題は、友達がいない場合、複数のステータス更新を行ったにもかかわらず、投稿が 1 つも表示されないことです。

解決策は、友人テーブルに行を作成して、私を自分の友人として追加することです。しかしその場合、「Show List of Friends」ページやその他の関連ページに自分の名前が表示されないようにする必要があります。

私は最初に使用INNER JOINしていて、上記の問題を抱えていました。その後、同様の問題LEFT JOINが発生し、提案されたとおりにスクリプトを変更しました。その投稿のOPの問題は解決したようですが、私のものではありません。その投稿にコメントを送信できません (おそらく 2 年前の投稿です)。だから私はこの投稿を作成しています。

4

3 に答える 3

3

更新:あなたが友達の投稿も欲しかったことを考慮していませんでした.

すでに回答を正しいものとしてマークしていますが、INステートメントは通常 a よりも遅いため、JOINこれを試すことができます。

SELECT * 
FROM statusUpdates AS su LEFT JOIN friends AS fr
ON fr.frContactID = su.authorID
WHERE (fr.frHostID = 105090 or su.authorID = 105090)
GROUP BY su.statusID
ORDER BY su.statusID
DESC LIMIT 0,5

最初の答え:

where 条件を次のように変更するだけです。

WHERE (fr.frHostID = 105090)

WHERE (su.authorID = 105090)

その理由は、左結合の右部分に where 条件を入れているため、友人の存在を強制しているためです。

ところで、この2つの投稿に注意してください:

PHP で mysql_* 関数を使用してはいけないのはなぜですか?

PHPでSQLインジェクションを防ぐにはどうすればよいですか?

于 2013-07-02T09:08:16.543 に答える
1

代わりに次のクエリを使用してください。

SELECT * FROM statusUpdates AS su 
WHERE su.authorID = 105090 
OR su.authorID IN (
    SELECT fr.frContactID 
    FROM friends AS fr 
    WHERE fr.frHostID = 105090
)
GROUP BY su.statusID
ORDER BY su.statusID DESC 
LIMIT 0,5
于 2013-07-02T08:59:46.243 に答える
0

このクエリを試してください

SELECT * FROM statusUpdates 
WHERE autherID in (select frContactID from friends where frHostID = 105090)
or authorID = 105090
LIMIT 0,5
于 2013-07-02T09:00:53.213 に答える