マスターの皆様: テーブル A のフィールドは id、content、テーブル B のフィールドは id、content、userid、edittime です。テーブル B のデータは、テーブル B のコンテンツへのユーザーのアクセスです。編集ページからテーブル A を変更します。次の機能を実装したいです。
ユーザーがログインしていない場合は、テーブル A の内容が ID 順に抽出されて表示されます。ユーザーがログインしている場合は、引き続き ID 順に表示されます。テーブルAではID行の内容が表示されますが、ログインユーザーが変更した内容がテーブルBに存在する場合は、テーブルBの最新の変更内容が別行に表示されます。このように書いたのですが、少し動作が遅いような気がしますが、もっと効率的な方法はないでしょうか?テーブルの再設計も有効です。つまり、ユーザーがログインしていない場合にデフォルトのコンテンツを表示することが目的です。ユーザーがログインしている場合、コンテンツの表示順序は変わりません。表AのID順。皆さん、ありがとうございました。
session_start () ;
include("IncDB.php");
$result=mysql_query("SELECT * FROM content",$link); =mysql_fetch_row($result);
$abcb=array();
while($row)
{
@$result1=mysql_query("SELECT * FROM where id='".$ row[0]."' および userid='".$_SESSION['id']."' 編集時間の記述制限による順序 1",$link);
@$row1=mysql_fetch_row($result1); >if($row1==null)
{
$abcb[]=$row;}
else
{
$abcb[]=$row1;}
$row =mysql_fetch_row($result);
}
foreach($abcb as $v) {
echo "$v[0]$v[1]
"; >
?>
ディスカッションへの返信(解決策) 誰か助けてくれませんか?
少し複雑に見えます
ユーザーがログインしていない場合は、テーブル A (デフォルト データ) のデータを表示します。ユーザーがログインすると、テーブル B の対応する変更されたデータが表示されますそうではありません
コンテンツ テーブル内のすべてのレコードに対して usercontents テーブルに対してクエリを実行します
もちろん速度は遅くなります
に戻るxuzuningさん、私も同じです。これが原因だと思いますが、どうすればよいですか?何か良い方法はありますか?ありがとう!
u014202165 に返信、そういう意味です。各行の表示は、ユーザーがログインしていない場合、またはユーザーが変更していない場合はデフォルトが表示されますが、ユーザーがログインしている場合は、その行にはユーザーが変更した内容が表示されます。
一般的な理解は次のとおりです:
テーブル A はメインレコードテーブルですテーブル B は変更ログです
テーブル構造が変更されない場合、ログインしているユーザーのレコードは簡単にクエリできます。 完全な
select * from contents a left join (select * from usercontents where userid=[user session_id] order by edittime desc limit 1) b on a.id=b.id
in取り出されたデータはデフォルトのものと最新のものを含めて、それに応じてページを処理できます。
データ量が非常に大きい場合は、ユーザーの最終変更結果を記録する最終変更結果テーブルを作成することをお勧めします。各ユーザーに対して 1 つのエントリのみが保持され、単純なテーブルの関連付けが可能です。ログを入力せずに調べるために使用します。
忘れていましたが、関連フィールドのインデックスを作成することを忘れないでください。そうしないと、データ量が多い場合に非常に遅くなります。
テーブル B にも同じことが当てはまります。各ユーザーのID項目、A個のデータのみ。コードだけを使用することは可能ですか?試してみます。
取り出したデータにデフォルトと最新のデータが含まれている場合、実際には 2 つのテーブル A と B を 1 つに結合することはできますが、テーブル A のユーザー ID は空と表示されます。しかし、次に何をすればいいでしょうか?私が言いたいのは、ユーザーのコンテンツをデフォルトのコンテンツに置き換える方法です。
さて、仏陀を西に送りましょう
userid=$_SESSION['id'] を満たすのは 1 つだけです!
select a.id, case when b.content is null then a.content else b.content end content from contents a left join (select * from usercontents where userid=【用户session_id】 order by edittime desc limit 1) b on a.id=b.id
テーブル B の場合、このクエリは、各ユーザーが各 ID で持つエントリの数に関係なく適用されます。
サブクエリはユーザー ID で検索し、編集時間によって逆順にソートし、最後のものだけを取得するためです。
ありがとう
勉強します
コンテンツはテーブル a、usercontent はテーブル b です。私のコードはこのように書かれていますが、うまく機能しないようです。間違っているはずですが、どう変更すればよいでしょうか?ありがとう!
session_start () ;
include("IncDB.php");
$result=mysql_query(b.content が null の場合) a.content else b.content コンテンツから終了 a left join
(select * from b where userid='".$_SESSION['id']."' order by edittime desc limit 1) b on a.id= b.id,$link);
$row=mysql_fetch_row($result);
while($row)
{
$abcb[] = $row
($result);
}
foreach($abcb as $v) {
echo "$v[0]$v[1]
";
}
/ /mysql_close($link);
?>
xuzuning に戻りますが、うまくいかないようです。また、ステートメント内の while($row1) が 1 つ減っていませんか?同じユーザーが複数のコンテンツを変更する可能性があるためです。
制限は 1 です。1 つだけ確認できるデータは何個ですか?
ユーザーが複数のレコードを変更する可能性があるため、1 つのレコードをチェックするだけでは問題を解決できません。どうすればいいのかわかりません。