各位大神:我有两个表,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] <br>"; }}
contents 是a表;usercontents是b表。我的代码是这么写的,好像不行啊。肯定是我错了,但该怎么改呢?谢谢谢谢!
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 了,多少条数据不也只查得一条?
只查一条出来不能解决问题,因为,有可能用户会修改多条记录。不知道咋办了。

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

你应该关心DependencyInjection(DI),因为它能让你的代码更清晰、更易维护。1)DI通过解耦类,使其更模块化,2)提高了测试的便捷性和代码的灵活性,3)使用DI容器可以管理复杂的依赖关系,但要注意性能影响和循环依赖问题,4)最佳实践是依赖于抽象接口,实现松散耦合。

是的,优化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)优化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,并避免使用

theKeyStrategiestosiminificallyBoostphpapplicationPermenCeare:1)useOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)优化AtabaseInteractionswithPreparedStateTemtStatementStatementSandProperIndexing,3)配置

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增强codemodocultion,可验证性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

选择DependencyInjection(DI)用于大型应用,ServiceLocator适合小型项目或原型。1)DI通过构造函数注入依赖,提高代码的测试性和模块化。2)ServiceLocator通过中心注册获取服务,方便但可能导致代码耦合度增加。

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)启用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替换loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

phpemailvalidation invoLvesthreesteps:1)格式化进行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Dreamweaver Mac版
视觉化网页开发工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能