2013-06-04 65 views
0

我是全新的MySQL。看起來好像我需要在MySQL請求中做某種循環,但我認爲對於某些「INNER JOIN」內容可能會更有效。如何在不依賴PHP循環的情況下執行此查詢?

這是我的PHP代碼:

$query = 'SELECT id FROM membres WHERE pseudo = :pseudo LIMIT 1'; 
$req = $dtb -> prepare($query); 
$req -> execute(array(
    'pseudo' => $_COOKIE['pseudo'] 
)); 
while($donnes = $req -> fetch()){ 
    $id_pseudo = $donnes['id']; 
} 
$req -> closeCursor(); 
$query = 'SELECT id_chanson FROM samples WHERE id_membre = :id_pseudo'; 
$req = $dtb -> prepare($query); 
$req -> execute(array(
    'id_pseudo' => $id_pseudo 
)); 
$id_chansons = array(); 
while($donnes = $req -> fetch()){ 
    $id_chansons[] = $donnes['id_chanson']; 
} 
$req->closeCursor(); 
$nSongs= count($id_chansons); 
$query = 'SELECT nom, pathName, date FROM chansons WHERE id = :id_chanson'; 
$req = $dtb -> prepare($query); 
for($i=0;$i<$nSongs;$i++){ 
    $req -> execute(array(
     'id_chanson' => $id_chansons[$i] 
    )); 
    while($donnes = $req -> fetch()){ 
     $nomChanson[$i] = $donnes['nom']; 
     $pathName[$i] = $donnes['pathName']; 
     $date[$i] = $donnes['date']; 
    } 
} 

編輯:我的表名是 「香頌」(法語歌曲) 「membres」(用戶)和 「樣本」

:)

+0

歡迎來到Stack Overflow。感謝您格式化您的代碼。如果你談論你想要做的SQL查詢和表結構,這將會有所幫助。你在PHP中而不是在MySQL中循環。 – John

+0

我已經編輯了你的問題了一點......它還說你在找什麼? – John

+0

是的!太棒了!! :) ty編輯 – pufmaigre

回答

0

你是對的,它往往更高效運行的單個查詢,而不是多個查詢。數據庫速度更快(往返次數更少),並且它使得代碼更加友好。

這裏有一個例子SQL查詢將從chansons檢索行:

SELECT c.nom 
     , c.pathName 
     , c.date 
     FROM (SELECT id FROM membres WHERE pseudo = :pseudo ORDER BY id LIMIT 1) m 
     JOIN samples s 
     ON s.id_membre = m.id 
     JOIN chansons c 
     ON c.id = s.id_chanson 
    ORDER BY 1 

注:

如果從其他表所需要的ID值在結果集中返回,對於那些表達式可以也包括在SELECT列表中。 (從你的代碼,我沒有看到,被用於除後續查詢任何其他的ID值...但當然,這並不意味着他們沒有在其他地方引用。

我增加了一個ORDER BY如果有多個行滿足查詢條件,如果沒有ORDER BY子句,那麼MySQL將返回哪一行是任意的,也就是說,返回的結果是後續執行不保證與前一次運行相同。)

上面的查詢使用內聯視圖(MySQL稱之爲派生表),別名爲m,以獲得LIMIT 1上返回的行數從membres。如果您不需要LIMIT,則可以通過刪除該內嵌視圖來簡化查詢。

INNER關鍵字是可選的,但對優化器沒有影響。也就是說,INNER JOINJOIN是同義詞。

+0

非常有幫助! TY!我會讓你知道我什麼時候完成:) – pufmaigre

+0

YEAAAAAAAH PARTY :) 這很好!這個問題讓我很頭疼,即使這不是什麼大事我都很感激 – pufmaigre

0
select m.id, s.id_chanson, ch.nom, ch.pathName, ch.date 
    from membres m 
     inner join samples s on m.id = s.id_membre 
     inner join chansons ch on s.id_chanson = ch.id 
where pseudo = :pseudo 
+0

非常感謝!讓我們試試這個! – pufmaigre

相關問題