2011-11-07 151 views
0

一個別名錶由於需要將多個表在單個查詢,我不能對外部查詢使用SQL_CALC_FOUND_ROWS(或LIMIT)(數量會高於預期)。使用多個PDO預處理語句

這裏是理想的查詢,如果子查詢中使用MySQL的SQL_CALC_FOUND_ROWS支持:

SELECT events.*, bands.* 
    FROM events 
     LEFT JOIN bands ON events.event_id = bands.event_id 
    WHERE e.event_id IN (
      SELECT * FROM (
       SELECT SQL_CALC_FOUND_ROWS e.event_id 
        FROM events 
        WHERE events.date > NOW() 
        ORDER BY events.date ASC LIMIT 0, 25 
      ) ALIAS 
    ) 
ORDER BY events.date ASC 

This question建議創建別名的表,但我不知道如果我能做到這一點與PDO預處理語句。

我嘗試這一點,但因爲FOUND_EVENTS被解釋爲一個(不存在)列名瞭解析錯誤:

$st1 = $pdo->prepare("(SELECT SQL_CALC_FOUND_ROWS e.event_id 
          FROM events 
          WHERE events.date > NOW() 
          ORDER BY events.date ASC LIMIT 0, 25 
        ) AS FOUND_EVENTS"); 

$st2 = $pdo->prepare("SELECT events.*, bands.* 
         FROM events 
          LEFT JOIN bands ON events.event_id = bands.event_id 
         WHERE e.event_id IN (
          FOUND_EVENTS 
         ) 
         ORDER BY events.date ASC"); 

$st1->execute(); 
$st2->execute(); 

我寧願堅持預處理語句,如果有可能,但是任何可行的解決方案將是大!

回答

0

我會做兩個單獨的查詢。

如果您之所以使用SQL_CALC_FOUND_ROWS是儘量節省運行時間,你可能會驚訝地知道,在許多情況下,這將是很多,很多更快,負荷較小的數據庫,使用兩個獨立的而是用一個簡單的COUNT(*)分組函數來計算總行數,另一個使用LIMIT來實際檢索行。

Here is more explanation of why this is the case

更重要的是,如果你在兩個單獨的查詢做,那麼你可以這樣做實際上獲取行的一個第一,然後你只需要做的COUNT(*)如果第一個第二個返回最大行數。

+0

奇怪的是,性能會受到影響。雖然性能對我的問題並不完全至關重要(結果將被緩存),但這似乎是最簡單的解決方案。謝謝! – nathanb