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

Спасибо, человек, вы легко поняли, поэтому я думаю, что с тех пор я смогу сделать подобные вещи on :) – Peter

+0

О, еще одна вещь, я пытался подсчитать значения, и это дало ошибку, поэтому я искал ее и обнаружил, что вам нужно использовать группу. Я пробовал «GROUP BY l.ImgID, l.SiteID, f.FavID» и несколько других комбинаций, но это не сработает, не знаете ли вы, как это сделать? – Peter

+0

Вы хотите знать, сколько записей в целом или сколько записей было возвращено? – Machavity

1

вы хотите использовать «JOIN»

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, похоже, одинаковы для простых запросов. Обратитесь к [this] (http://stackoverflow.com/questions/2577174/join-vs-subquery) – Kamehameha

Смежные вопросы