2013-04-14 121 views
2

我目前有以下查詢(以及一些圍繞vB代碼)。我希望我可以將它變成單個SELECT語句,而不必在每個頁面上運行10個以獲取個人名稱。MySQL - 組合多個查詢

$results = $db->query_read_slave(" 
    SELECT user.id AS steam, user.skills AS level 
    FROM wcsp.wcgousers AS user 
    WHERE race = '_wcs_' 
    ORDER BY ABS(user.skills) DESC LIMIT 10 
    "); 

$rank = 1; 
while ($user = $db->fetch_array($results)) { 
    $result = $db->query_first(" 
     SELECT old.name AS name 
     FROM wcsp.warn_oldnames AS old 
     WHERE id = '$user[steam]' 
     ORDER BY lasttime 
     DESC LIMIT 1 
    "); 

    $listing[] = array("id" => $user['steam'], "level" => $user['level'], "name" => $result['name'], "rank" => $rank); 

    $rank += 1; 
} 

我已經試過LEFT JOIN,但我遇到的問題是,我需要在左子查詢JOIN類似:

SELECT user.id AS steam, user.skills AS level, names.name AS name 
FROM wcsp.wcgousers AS users 
LEFT JOIN 
    (
     SELECT names.name 
     FROM wcsp.warn_oldnames AS names 
     WHERE id = wcsp.wcgousers.id 
     ORDER BY lasttime DESC LIMIT 1 
    ) AS names 
ON names.id = users.id 
WHERE users.race = '_wcs_' 

哪個都不行由於不同的數據庫檢查在子查詢中。

回答

1

如果我理解正確,您希望爲每個用戶獲取最新的Name

SELECT a.id AS steam, 
     a.skills AS level, 
     b.name 
FROM wcgousers a 
     INNER JOIN warn_oldnames b 
      ON a.ID = b.ID 
     INNER JOIN 
     (
      SELECT ID, MAX(lasttime) max_date 
      FROM warn_oldnames 
      GROUP BY ID 
     ) c ON b.ID = c.ID AND 
       b.lastTime = c.max_date 
WHERE a.race = '_wcs_' 
-- ORDER BY ABS(a.skills) DESC 
-- LIMIT 10 
+1

你明白我的意思了。這工作得很好。非常感謝,我從來沒有想過要在子查詢中做多個INNER JOIN。 – Josh

+0

不客氣的':D'很高興幫助.. –