【问题标题】:MySQL - combining multiple queriesMySQL - 组合多个查询
【发布时间】:2013-04-14 05:53:13
【问题描述】:

我目前有以下查询(以及一些周围的 vB 代码)。我希望我可以将其精简为单个 SELECT 语句,而不是在每个页面上运行 10 个以上来获取个人姓名。

$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,但遇到的问题是我需要在 LEFT 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_'

由于子查询中的数据库检查不同,这将不起作用。

【问题讨论】:

    标签: mysql sql join greatest-n-per-group


    【解决方案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
    

    【讨论】:

    • 你正确地理解了我。这很好用。非常感谢,我从没想过用子查询做多个 INNER JOINS。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    相关资源
    最近更新 更多