2014-01-31 82 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