2010-11-22 155 views
0

我有一個名爲表IMAGES,其中有屬性名稱img_ID這是主鍵單個SQL查詢與多對多的關係獲取從表中結果

有另一個表稱爲收藏,其中有兩個屬性「img_ID」 & user_ID ... img_ID作爲外鍵到的圖像和user_ID作爲外鍵用戶

現在我需要從IMAGES所有img_ID S的的細節從收藏其中user_ID一些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 

這種方法有一個缺陷&背面繪製

探傷            =這是對時間標記被破壞

回拉的順序=有在嵌套循環的查詢。

問題:這一切都可以在查詢中完成嗎?如果是,那麼如何?

回答

2

使用JOIN:

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

另外,更改代碼中使用mysqli和準備的語句與綁定變量既要提高性能,並消除了SQL注入攻擊的威脅。

+0

您的查詢有一些錯誤,我建議PDO超過mysqli。每個主要的PHP ORM都建立在它之上,原因很多。 – 2010-11-22 01:49:42

+0

是EXACT語法還是我需要放的東西而不是i&f – Moon 2010-11-22 01:51:02

+0

@Dan Grossman - 「有些錯誤」=「單字母錯字」。但是,謝謝,修正它。而且我不會做很多PHP,所以我會在PDO上遵循你的要求,但是要麼會比直接的'mysql_query'好得多 – Donnie 2010-11-22 01:51:22

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 = ??? 
+0

DISTINCT沒有用處,因爲在收藏夾表中,元組img_ID和user_ID充當我的主鍵 – Moon 2010-11-22 02:01:50

0

沒有循環,只是查詢兩個表。

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