1

私の DB には、課題と回答の 2 種類の画像があります。どちらにも緯度/経度の位置列があります。このクエリでは、ユーザーがINNER JOIN を介して最近作成したチャレンジまたはアンサーを選択したいと考えています。

(この背後にあるビジネス ロジック: 基本的には、ユーザーの最後の既知の場所を含むユーザーのリストを取得したいと考えています。これは、最新のチャレンジまたは回答のいずれか最新のものによって決定されます。ユーザーが最後に既知の場所を持っていない場合、このリストに含めるべきではありません。)

私は得てい[Err] 1054 - Unknown column 'U.Id' in 'where clause'ます:

SELECT
    U.Id,
    U.TotalPoints,
    LastImage.Lat,
    LastImage.Lng
FROM User U
INNER JOIN
(
    SELECT Lat, Lng FROM
    (
        (SELECT Lat, Lng, CreatedOn FROM AnswerImage WHERE UserId = U.Id ORDER BY Id DESC LIMIT 1)
        UNION ALL
        (SELECT Lat, Lng, CreatedOn FROM ChallengeImage WHERE UserId = U.Id ORDER BY Id DESC LIMIT 1)
    ) LastImages ORDER BY CreatedOn DESC LIMIT 1
) LastImage
WHERE U.Type = 1 AND U.Status = 2
ORDER BY TotalPoints DESC;

派生した「LastImages」テーブル (または適切な用語が何であれ) 内から User テーブル (エイリアス U) を参照できないようです。

誰でも助けることができますか?他の方法を試しましたが、すべての要件を満たすものはありません:

  1. ユーザーが少なくとも1 つのチャレンジまたは 1 つの回答を持っている場合にのみ行が返されます (したがって UNION)。
  2. 最新の (ChallengeImage.CreatedOn および AnswerImage.CreatedOn によって決定される) 画像が結合で使用されます。

ありがとう!

4

2 に答える 2

2
SELECT u.id,
       u.TotalPoints,
       IF(IFNULL(a.CreatedOn, '1900-01-01') > IFNULL(c.CreatedOn, '1900-01-01'), a.Lat, c.Lat) AS Lat,
       IF(IFNULL(a.CreatedOn, '1900-01-01') > IFNULL(c.CreatedOn, '1900-01-01'), a.Lng, c.Lng) AS Lng
FROM User AS u
LEFT JOIN
    (SELECT UserId, Lat, Lng, CreatedOn
     FROM AnswerImage AS a
     JOIN (SELECT UserId, MAX(CreatedOn) AS CreatedOn
           FROM AnswerImage
           GROUP BY UserId) AS amax
     USING (UserId, CreatedOn)) AS a
    ON u.id = a.UserId
LEFT JOIN
    (SELECT UserId, Lat, Lng, CreatedOn
     FROM ChallengeImage AS c
     JOIN (SELECT UserId, MAX(CreatedOn) AS CreatedOn
           FROM ChallengeImage
           GROUP BY UserId) AS cmax
     USING (UserId, CreatedOn)) AS c
    ON u.id = c.UserId
WHERE U.Type = 1 AND U.Status = 2
    AND (a.Lat IS NOT NULL OR c.Lat IS NOT NULL)
ORDER BY TotalPoints DESC;

サブクエリは、テーブル内のグループごとに最後の行を取得する一般的な方法の 1 つです。

各グループの最後のレコードを取得する

User次に、ユーザーが両方のテーブルで一致していなくても結果が得られるように、それらをテーブルに結合したままにしました。

于 2014-06-03T07:17:12.937 に答える
0

あなたuserid = u.idは確かに間違った場所にいます。order by1 つのレコードを取得しているので、最後の行の の理由は何ですか? これを試してみてください。テストされていません:(

select u.id, u.totalpoints, a.lat, a.lng
from user u
join (
    select userid, lat, lng, createdon
    from AnswerImage
    union all
    select userid, lat, lng, createdon
    from ChallengeImage) a on a.userid = u.id
where u.type = 1 and u.status = 2
order by a.createdon desc
limit 1;
于 2014-06-03T07:18:05.220 に答える