单个SQL查询从具有多个多关系的表中获取结果

时间:2010-11-22 01:39:39

标签: php mysql sql

我有一个名为 IMAGES 的表格,其中有属性名称img_ID,即主键

还有另一个名为收藏夹的表格,其中有两个属性'img_ID'& user_ID ... img_ID用作图片的外键user_ID用作外键给用户

现在我需要来自收藏夹的所有img_ID图片的详细信息,其中user_ID x-value < / em>的

我可以这样做,b.t.w我正在使用PHP&amp; 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";

PSEUDO CODE就像

RUN QUERY
for each img_ID where user_ID is this
    RUN QUERY    
    for each img_ID
        perform DISPLAY

这种方法有一个缺陷&amp;反抽奖

FLAW =时间戳上的订单被销毁

back-draw =在嵌套循环中有一个查询..

问题:这一切都可以通过查询完成吗?如果是,那么如何?

3 个答案:

答案 0 :(得分:2)

使用联接:

select
  i.*
from
  favorites f
  join images i on f.img_id = i.img_id
where
  f.user_id = <user id>

此外,将代码更改为使用mysqli和带有绑定变量的预处理语句,以提高性能并消除SQL注入攻击的威胁。

答案 1 :(得分:0)

SELECT i.*   -- possibly would need to be "SELECT DISTINCT i.*" instead
FROM images AS i
    INNER JOIN favorites AS f
        ON f.img_ID = i.img_ID
WHERE f.user_ID = ???

答案 2 :(得分:0)

没有循环,只查询两个表。

SELECT 
    images.*
FROM
    images
INNER JOIN
    favorites
ON
    favorites.img_ID = images.img_ID
WHERE
    favorites.user_ID = X