如何交叉檢驗後顯示內容

來源:互聯網
上載者:User
各位大神:我有兩個表,A表裡面的欄位分別是id,content,B裡面是id,content,userid,edittime,B表裡面的資料是使用者通過EDIT頁面對A表裡面內容的修改。我想實現以下功能:
如果使用者沒有登入,則按照ID順序提取A表裡面的內容顯示;如果使用者登入,則仍按A表中ID順序顯示,但如果該ID行裡面的內容,該登入使用者已經修改,並在B表裡面有,則改行顯示B表中最新修改的內容。我是這麼寫的,好像運行起來有點慢,有沒有更有效率的方法?重新設計表也可以。總之,我的目的是如使用者沒有登陸則顯示預設內容,如登陸了,則把相關內容替換顯示為使用者修改後的內容,顯示內容的順尋還是按照A表中ID的順序。謝謝各位大神。
session_start () ;
include("IncDB.php");
$result=mysql_query("SELECT * FROM contents",$link);
$row=mysql_fetch_row($result);
$abcb=array();
while($row)
{
@$result1=mysql_query("SELECT * FROM usercontents where id='".$row[0]."' and userid='".$_SESSION['id']."' order by edittime desc limit 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表中使用者對應修改的資料,是不是這樣的

你對 contents 表的所有記錄,都執行一次對 usercontents 表的查詢
那當然慢啦

回xuzuning,我也這麼覺得是這個原因,那該怎麼弄呢?有好辦法嗎?謝謝!

回u014202165,是這個意思。每一行的顯示都是這個規則,沒登陸或使用者未修改的,就顯示預設,但如果使用者登入了,那麼該行就顯示使用者修改的內容。

大概的理解是:
A表是主記錄表
B表是修改日誌

如果不改表結構,已登入使用者的記錄可以通過簡單的查詢完成
select * 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項下,只保留一條資料。是不是用您的代碼就可以了?我試試看。

如果取出來的資料是包含預設的和最新的,那也沒有意義,我其實可以把A和B兩張表合一個也可以,只不過A表中的userid顯示為空白就可以。但下面怎麼辦呢?我的意思是怎麼實現把使用者的內容替代顯示預設的內容。

好吧,送佛送到西

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

滿足 userid=$_SESSION['id'] 的只有一條!

To樓主:

對於B表,不論每個使用者在每個ID下有多少條,這個查詢都是適用的。
因為子查詢是按使用者ID進行尋找的,並且按編輯時間倒排序並只取了最後一條。

謝謝

我好好學習一下

session_start () ; include("IncDB.php"); //$_SESSION['id'] 只有一個,即使能查到多條記錄,由於你有 limit 1,所以至多也只會有一個結果$result1=mysql_query("SELECT * FROM usercontents where userid='".$_SESSION['id']."' order by edittime desc limit 1",$link); $row1=mysql_fetch_row($result1); //把登入使用者的資訊先查出來$result=mysql_query("SELECT * FROM contents",$link); $row=mysql_fetch_row($result); $abcb=array(); while($row) {   if($row1==null)   {     $abcb[]=$row;  }   else   {     $abcb[]=$row1;}     $row=mysql_fetch_row($result);   }   foreach($abcb as $v) {    echo "$v[0]$v[1] 
"; }}

contents 是a表;usercontents是b表。My Code是這麼寫的,好像不行啊。肯定是我錯了,但該怎麼改呢?謝謝謝謝!

session_start () ;
include("IncDB.php");
$result=mysql_query(select a.id, case when b.content is null then a.content else b.content end from 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;
$row=mysql_fetch_row($result);
}
foreach($abcb as $v) {
echo "$v[0]$v[1]
";
}
//mysql_close($link);
?>

回xuzuning,好像不行。另外,語句是不是也少一個while($row1)?因為同一個使用者有可能更改多條內容。

都 limit 1 了,多少條資料不也只查得一條?

只查一條出來不能解決問題,因為,有可能使用者會修改多條記錄。不知道咋辦了。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.