0

MySQL で結合しようとしている 2 つのテーブルがあります。

レビュー:

|  review_id  |  comment       |  reviewer_id  | user_id  |
-----------------------------------------------------------
|  1          |  some text.    |  501          | 100      |    
|  2          |  lorem ipsum   |  606          | 100      |
|  3          |  blah blah.    |  798          | 120      |
|  4          |  foo bar!      |  798          | 133      |
-----------------------------------------------------------

レビューステータス:

 |  review_id  |  status  | timestamp   |
 ----------------------------------------
 |  1          |  10      | 1364507521  |
 |  1          |  101     | 1364508057  |
 |  2          |  100     | 1364509033  |
 |  1          |  150     | 1364509149  |
 |  2          |  120     | 1364509283  |
 |  2          |  122     | 1364855948  |
 |  3          |  120     | 1364509283  |
 |  3          |  122     | 1364855948  |
 |  1          |  110     | 1364855945  |
 |  4          |  100     | 1364509283  |
 |  4          |  115     | 1364855948  |
 |  4          |  210     | 1364855945  |
 ----------------------------------------

私が望むのは、次のような結果です。

結果

 | review_id | comment     |  reviewer_id | user_id | status | timestamp  |
 --------------------------------------------------------------------------
 | 1         | some text.  |  501         | 100     | 200    | 1364855945 | 
 | 2         | lorem ipsum |  606         | 120     | 122    | 1364855948 |
 --------------------------------------------------------------------------

1) review_status テーブルからの最新のエントリ 2) 特定の範囲のステータス コード (この場合は 100 ~ 199) 3) review テーブルからの複数の user_id。

これは現在、私の人生で働くことができないという私の質問です。

SELECT r.review_id, r.comment, r.reviewer_id, r.user_id
FROM reviews AS r 
INNER JOIN 
   (SELECT s.status, max(s.timestamp)
    FROM review_status AS s
    WHERE s.status < 200
    AND s.status > 99;
    GROUP BY s.review_id) AS r_s
ON r.review_id = r_s.review_id
WHERE r.user_id IN (100,120);

どんな助けでも大歓迎です!ありがとう。

4

4 に答える 4

0
SELECT r.review_id, r.comment, r.reviewer_id, r.user_id, tt.status,tt.timestamp
FROM (
    SELECT rs2.review_id,rs2.status,rs2.timestamp
    FROM (
        SELECT MAX(rs.timestamp) as mts
        FROM reviews rr
        JOIN review_status AS rs ON rs.review_id = rr.id
        WHERE rs.status < 200 AND rs.status > 99
        AND rr.user_id IN (100,120)
        GROUP BY rs.review_id
    ) as t
    JOIN review_status rs2 ON rs2.timestamp = t.mts
    GROUP BY rs2.review_id #remove duplicate statuses with the same timestamp
) as tt
JOIN reviews as r ON r.id = tt.review_id

user_id フィルターと status フィルターは、毎回 statuses テーブル全体を選択して結合することを避けるために、最も内側のクエリに含める必要があります。

于 2013-04-02T21:27:17.550 に答える
0

JOINone and oneを使用した私の試みは次のcorrelated sub-queryとおりです。

SELECT r.*, rs.*
FROM Reviews AS r 
INNER JOIN Review_status AS rs ON r.review_id = rs.review_id 
WHERE rs.status BETWEEN 99 AND 200 AND
      r.user_id IN (100,120) AND
      rs.timestamp = (SELECT MAX(timestamp) FROM Review_status 
                      WHERE review_id = r.review_id
                      ORDER BY timestamp DESC)
ORDER BY r.review_id;

その SQL フィドル: http://sqlfiddle.com/#!2/02f18/6

于 2013-04-02T21:42:52.987 に答える
0

これを試して:

SELECT r.*, r_s.*
FROM review_status r_s LEFT JOIN reviews r
ON r.review_id = r_s.review_id
WHERE r_s.user_id > 100 AND r_s.user_id < 120
ORDER BY r_s.timestamp DESC;
于 2013-04-02T21:17:20.767 に答える