2013-05-18 92 views
0

我有這個功能,從數據庫中,在歌曲表的歌曲,即量和藝術家從藝術家表誰在歌曲表歌曲量獲取信息:合併兩個查詢到單個查詢

function getInfo() { 
    try { 
     $q = $this->connection->prepare('SELECT artist_id FROM '.TBL_SONG.''); 
     $q->execute(); 
     if ($q->rowCount() > 0) { 
      $songs = $q->rowCount(); 
     } else { 
      $songs = '0'; 
     } 
     $q = $this->connection->prepare('SELECT id FROM '.TBL_ARTIST.' a WHERE EXISTS (SELECT * FROM '.TBL_SONG.' s WHERE a.id = s.artist_id)'); 
     $q->execute(); 
     if ($q->rowCount() > 0) { 
      $artists = $q->rowCount(); 
     } else { 
      $artists = '0'; 
     } 
     return "<span class='italic'>Current songs: </span>".$songs." <span class='italic'>Active artists: </span>".$artists; 
    } catch (PDOException $e) { 
     echo RESULTS_ERROR; 
     logError($e->getMessage()); 
    } 
} 

第一個查詢獲取歌曲表中的歌曲數量並將行數返回給變量。第二個查詢從歌手錶中獲取藝術家ID,如果他們在歌曲表中有歌曲。這個函數的結果是返回兩個值。

我希望能夠從單個查詢中返回這兩個值。我試着將它作爲一個查詢寫入並獲取結果並使用count函數來獲取我需要的行數量,但這似乎不起作用。真的不知道我要去哪裏錯了。另外,用if語句檢查行計數是否大於0並將其存儲在變量中是沒有意義的,因爲它無論如何都會返回值'0'?謝謝。

回答

1

這其實很簡單。您想要使用藝術家ID加入藝術家表格和歌曲表格。從那次加入,你想知道不同的藝術家ID和歌曲ID號碼。您想查詢將是這樣的:

select count(distinct a.id) as artists, count(distinct s.id) as songs 
from artists a 
inner join songs s on s.artist_id = a.id; 

我強烈建議你將其插入之前PHP直接從某種類型的控制檯中看到您的查詢。輸出將是一個單列,看起來是這樣的:

+---------+-------+ 
| artists | songs | 
+---------+-------+ 
|  20 | 150 | 
+---------+-------+ 

從PHP,你只需要獲取一個行的答案,並用它在你的迴應:

if ($q->rowCount() > 0) { 
    $c = $q->fetchObject(); 
    $output = "<span class='italic'>Current songs: </span>{$c->songs}<span class='italic'>Active artists: </span>{$c->artists}"; 
} 
+0

根據您的數據庫組織,你可能甚至不需要加入表格。您可能只能從歌曲表中統計id和artist_id。 – slashingweapon

+0

啊,這個工程!玩弄它讓我產生了一些令人困惑的結果。我可以得到正確的藝術家數量,但是如果我將查詢的第二部分更改爲表格列而不是*,則會改變藝術家數量。此外,從$ - > fetch()更改爲$ q-> fetchAll(PDO :: FETCH_ASSOC)將導致其停止工作。最後,在第一部分中使用COUNT(id)作爲artist_count並在第二部分中使用COUNT(id)作爲song_count時,它將對藝術家有效,但對於歌曲計數,它會說未定義變量,即使知道它們都來自相同的數組:/ – Tom