我有一个名为IMAGES的表,其中属性名称img_ID
是主键,
还有另一个名为收藏夹的表,其中有两个属性'img_ID'和user_ID
... img_ID
用作>图像的外键,user_ID
充当用户的外键
现在我需要来自收藏夹的IMAGES所有img_ID
的详细信息,其中user_ID
是< em>x 值
我可以这样做,顺便说一句,我正在使用 PHP 和 mySQL
$gett = mysql_query("SELECT img_ID FROM favorites WHERE user_ID='".$variable."'");
if( mysql_num_rows($gett) > 0 )
{
while( $steps = mysql_fetch_assoc($gett) )
{
$res = mysql_query("SELECT * FROM images WHERE img_ID='".$steps['img_ID']."' ORDER BY img_Date");
if( mysql_num_rows($res) > 0 )
{
while( $result= mysql_fetch_assoc($res) )
{
echo $result['img_Name'];
echo $result['img_Desc'];
echo $result['img_ext'];
}
else
echo "no images were found";
}
}
else
echo "no favorites were found";
伪代码就像
RUN QUERY
for each img_ID where user_ID is this
RUN QUERY
for each img_ID
perform DISPLAY
这种方法有一个缺陷和一个缺点
缺陷 = 带有时间戳的订单被破坏
back-draw = 嵌套循环中有一个查询..
问题:这一切都可以通过查询来完成吗?如果是,那么如何?
最佳答案
使用连接:
select
i.*
from
favorites f
join images i on f.img_id = i.img_id
where
f.user_id = <user id>
另外,将您的代码更改为使用 mysqli以及带有绑定(bind)变量的准备语句,以提高性能并消除 SQL 注入(inject)攻击的威胁。
关于php - 单个 SQL 查询从具有多对多关系的表中获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4241561/