2014-01-31 55 views
0

所以,我已经投入了自己喜爱的图片表,我无法弄清楚如何得到它的正常工作如何使用两个MySQL表在一个声明中

基本上,这是设置:

ImageFavs 
FavID, UserID, ImgID 

ImageList 
ImgID, SiteID 

我想它选择从收藏表20幅左右图像,但只有在图像列表表

匹配SITEID是那些这是我此刻的代码,但它在我看来,它会从收藏夹中选择20张图像,然后只在匹配的网站实际上是chec时才显示它们糟透了。

#select matching sites 
for($i=0;$i<count($sites)-1;$i++){ 
    $siteinfo = explode("-",$sites[$i]); 
    $siteid = $siteinfo[0]; 
    $sitegroup = $siteinfo[1]; 
    $selection[$siteid]="exists"; 
    if($i!=0){ 
     $sqlextra .= " OR "; 
    } 
    else{ 
     $sqlextra = "AND ("; 
    } 
    $sqlextra .= "SiteID='".$siteid."'"; 
} 
if(!empty($sqlextra)){ 
    $sqlextra .= ")"; 
} 
else{ 
    $sqlextra = "AND SiteID='-1'"; 
} 

#show favourites 
if($_GET['f']==1){ 
    $sql="SELECT * FROM ImageFavs WHERE UserID='".$_SESSION['User_ID']."' AND Active = '1' ORDER BY RAND() LIMIT 20"; 
    #(rand is just me being lazy, eventually I'll figure out how to separate it onto pages) 
    $result = mysql_query($sql); 
    $num = mysql_numrows($result); 
    if($num>0){ 
     while ($row=mysql_fetch_array($result, MYSQL_BOTH)){ 
      if(empty($sqlextra2)){ 
       $sqlextra2 = " AND ("; 
      } 
      else{ 
       $sqlextra2 .= " OR "; 
      } 
      $sqlextra2 .= "ImgID='".$row['ImgID']."'"; 
     } 
     $sqlextra2 .= ")"; 
    } 
} 
#don't show favourites 
if(empty($sqlextra2)){ 
    $sqlextra2 = " ORDER BY RAND() LIMIT 20"; 
} 
$sql="SELECT * FROM ImageList WHERE Valid='1' ".$sqlextra.$sqlextra2; 

从这个这个输出$ sql中似乎是它可以是,但这样更加简洁,它的一个例子是这样的

SELECT * FROM ImageList WHERE Valid='1' AND (SiteID='6') AND (ImgID='5634' OR ImgID='8229' OR ImgID='9093' OR ImgID='5727' OR ImgID='7361' OR ImgID='5607' OR ImgID='7131' OR ImgID='5785' OR ImgID='7339' OR ImgID='5849' OR ImgID='7312' OR ImgID='5641' OR ImgID='8921' OR ImgID='7516' OR ImgID='7284' OR ImgID='5873' OR ImgID='8905' OR ImgID='7349' OR ImgID='7392' OR ImgID='8725') 

而且,当我在这里,会有一个非资源沉重的方式来计算每个网站用户的收藏数量?

这不是什么大事,只是在个人网站上乱搞,看看我能做些什么。

回答

1

您可以INNER JOIN你的两个表来得到你想要的结果。 INNER用于希望从两个表中获得结果的情况。最好使用别名来保持表格的直观。

SELECT l.* 
FROM ImageFavs f 
    INNER JOIN ImageList l ON f.ImgID = l.ImgID 
WHERE l.SiteID = [your site ID] 
    AND f.UserID='" . $_SESSION['User_ID'] . "' 
    AND f.Active = '1' 
    ORDER BY RAND() LIMIT 20 

要得到一个网站的计数,你可以使用GROUP BY。我想这应该让你那算不算

SELECT COUNT(f.ImgID) 
FROM ImageFavs f 
    INNER JOIN ImageList l ON f.ImgID = l.ImgID 
WHERE f.UserID='" . $_SESSION['User_ID'] . "' 
    AND f.Active = '1' 
GROUP BY l.SiteID 
+0

谢谢你,你有点让它很容易理解,所以我想我可以从现在开始做类似的事情在:) – Peter

+0

哦,还有一件事,我试图数数值,它给了一个错误,所以我查了一下,发现你需要使用group by。我试过'GROUP BY l.ImgID,l.SiteID,f.FavID'和一些其他组合,但它不起作用,你会碰巧知道如何做到这一点? – Peter

+0

你想知道总共有多少条记录或返回多少条记录? – Machavity

1

要使用“加入”

SELECT * FROM ImageFavs LEFT JOIN ImageList ON ImageFavs.ImgID = ImageList.ImgID WHERE ImageList.SiteID = <your_site_id> 
+0

感谢的人,我回答了你,但是当我在写别人发布,它增加了回复他们啊哈,但是,是,它工作正常,欢呼声,可能会选择其他人的最佳答案,虽然我从中学到了一点:) – Peter

1

该工程─

//Assuming $site_id contains the site ID/ 
$query = "select *.IF from ImageFavs as IF, ImageList as IL where IL.ImgId = IF.ImgId and IL.SiteId = $site_id LIMIT 20" 
+0

啊谢谢你,得到它的工作,这也是相当轻的计数部分每页运行7次运行? – Peter

+0

我认为应该。它简单易读。在MySql中,性能明智的子查询vs连接对于简单查询似乎是一样的。请参阅[this](http://stackoverflow.com/questions/2577174/join-vs-sub-query) – Kamehameha