我想知道我可能遇到的潜在问题。我的问题是,我说有2个表,一个叫发言人和客户。在客户端表中,客户端的扬声器ID为1,5,8(在STRING字段中保存) - 所以我使用explode()来获取值。
所以现在我必须拨打扬声器表3次以获得每个发言者的价值。这引入了一个问题,即如果有很多在线用户不会这样做会非常昂贵吗?
是否有从项目数组或其他内容调用表的替代方法?
我不太了解所有的PHP方法,所以任何帮助将不胜感激!
答案 0 :(得分:2)
我同意@RiggsFolly认为它可能不是存储数据的最佳方式,你可以这样做:
SELECT (whatever fields you want or speakers.* for all) FROM speakers JOIN clients ON clients.id=(clients.id) WHERE speakers.id IN (clients.field_with_speakers_list_string);
我相信这会让你前进。它应该返回你想要的东西。您只需要使用脚本中已有的客户端ID替换(clients.id)并将speaker.id更改为调用扬声器表中的ID字段,并将field_with_speakers_list_string更改为客户端表中的任何字段调用扬声器串,当然会将SELECT的一部分更改为要限制它的字段。
答案 1 :(得分:1)
根据您的数据库说明,每个客户端可以有多个扬声器。这是一对多(1-N)关系,通常用两个表表示。一个是主表,"客户",它存储有关客户端的信息,但没有关于扬声器的信息。从属表" speaker",存储有关每个发言者的信息以及与之关联的客户的ID。
例如,扬声器1,扬声器5和扬声器8在扬声器表中都具有相同的客户端ID。 speaker表中的client_id字段称为外键。
现在,您可以在一个查询中获取客户端1的所有发言人信息:
select * from clients, speakers where clients.clientid=speakers.clientid and clients.clientid=1
您当前的双表设计存在缺陷,因为您在clients表中有speakeridS列。以1-N关系表示ONE的外键列应始终位于" many"表,即"发言者"。
由于您当前的发言人表没有client_id信息,因此您必须编写数据转换器以将客户端表中的字符串逗号分隔的字段字段迁移到数字外键字段& #34;的clientid"在扬声器表中。这是一次性转换,因此您可以在PHP脚本中执行此操作:
$query="select * from clients";
$rs=mysql_query($query,$db);
while ($myrow=mysql_fetch_array($rs)){
$clientid=$myrow['clientid'];
$speakerids=explode(',',$myrow['speakers']);
foreach ($speakerids as $speakerid){
if (!is_numeric($speakerid)) continue;
$query="update speakers set clientid=$clientid where speakerid=$speakerid";
mysql_query($query,$db);
}
}
您的应用程序会在清单中显示发言人。但是,界面并不必指示您的存储结构。写一个循环并将客户端ID存储在每个发言者记录中。
如果同一个扬声器适用于多个客户端,那么您需要一个多对多(N-N)表。这是通过桥接表完成的。在这种情况下,客户端或扬声器表都不需要彼此了解。创建另一个名为" clientspeakers"其中包括至少两个外键:clientid和speakerid。