2

私は現在、次のクエリ (およびいくつかの周囲の vB コード) を持っています。個人の名前を取得するために各ページでさらに 10 個の SELECT ステートメントを実行するのではなく、これを 1 つの SELECT ステートメントにスリム化できることを望んでいました。

$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_'

サブクエリ内のデータベースチェックが異なるため、これは機能しません。

4

1 に答える 1

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
于 2013-04-14T06:29:19.960 に答える