簡體   English   中英

我該如何進行此查詢?

[英]How can I make this query?

這是測試表

----------------------------------------------
id | username | point | level | created_date
----------------------------------------------
 1 | name_a   |  1    |   1   | 2011-08-01
 2 | name_a   |  2    |   2   | 2011-08-02
 3 | name_b   |  5    |   1   | 2011-08-02
 3 | name_c   |  6    |   1   | 2011-08-02
 4 | name_d   |  1    |   1   | 2011-08-01
 5 | name_d   |  3    |   1   | 2011-08-02
 5 | name_d   |  5    |   2   | 2011-08-03
 4 | name_e   |  5    |   1   | 2011-08-01
 5 | name_e   |  5    |   2   | 2011-08-02
 5 | name_e   |  5    |   3   | 2011-08-03
----------------------------------------------

查詢的要求是查詢(盡可能在一個查詢中)用戶名,表的點。

  1. 按每個級別的用戶得分總和排序。
  2. 如果用戶在同一級別上獲得2分,則只能獲得最新分數。
  3. 按用戶名分組
  4. 總分必須小於10
  5. 每個級別的得分最高為5

輸出樣本:

--------------------
 username  | tpoint|
--------------------
  name_d   |  8    |
  name_b   |  5    |
  name_a   |  3    |
--------------------

name_ename_c被忽略。

聽起來很有趣!

SELECT username, SUM(point) AS points
FROM (SELECT username, level, point
      FROM (SELECT username, level, LEAST(point, 5) AS point
            FROM table
            WHERE points <= 5
            ORDER BY created_date DESC) AS h
      GROUP BY username, level) AS h2
GROUP BY username
HAVING points < 10
ORDER BY points DESC

這應該做到! 只需替換“表”。

編輯:

是否要排除得分超過5或值為5的行? 如果是這樣,只需刪除WHERE點<= 5。

SELECT SUM(t3.point) AS tpoint, t3.username
FROM (
    SELECT t1.level, t1.username, t1.created_date, t1.point
    FROM testing AS t1
    INNER JOIN (SELECT level, username, MAX(created_date) AS MaxDate
                FROM testing) AS t2
          ON (t1.level=t2.level AND t1.username=t2.username AND t1.created_date = t2.MaxDate)
    WHERE t1.point <= 5
    ) AS t3
GROUP BY t3.username
HAVING tpoint < 10
ORDER BY tpoint DESC

不知道我是否正確使用了別名,希望這有效!

連接的內部查詢是獲取最新的用戶名,單級點數> 5的級別組合。然后用於獲取每個用戶名的總和並丟棄超過10個點的用戶。

SELECT 
    Query2.username 
  , Sum(Query2.SomVanpoint) AS point 
FROM 
    (SELECT 
            test.username 
          , test.level 
          , Sum(test.point) AS SomVanpoint 
        FROM 
            test 
        INNER 
        JOIN 
            (SELECT 
                    test.username 
                  , test.level 
                  , Max(test.created_date) AS MaxVancreated_date 
                FROM 
                    test 
                GROUP 
                    BY test.username 
                  , test.level
            ) AS Query1 
            ON 
            (test.username         = Query1.username) 
            AND (test.level        = Query1.level) 
            AND (test.created_date = Query1.MaxVancreated_date) 
        GROUP 
            BY test.username 
          , test.level 
        HAVING 
            (((Sum(test.point))<= 5))
    ) AS Query2 
GROUP 
    BY Query2.username 
HAVING 
    (((Sum(Query2.SomVanpoint))< 10)) 
ORDER 
    BY Sum(Query2.SomVanpoint) DESC; 

===輸出:

username  | point
----------+------
name_d    |  8
name_b    |  5
name_a    |  3

好的,先參加第2部分....

SELECT *
FROM table a
WHERE NOT EXISTS (
   SELECT 1
   FROM table b
   WHERE b.username=a.username
   AND a.created_date>b.created_date
)

但是mysql並不能很好地處理推送謂詞,因此最大限度的技巧,但這將使查詢變得非常復雜 - 如果你遇到性能問題,值得重新審視。 現在添加其他東西....部分1,3和5

SELECT username, level, SUM(point)
FROM 
(SELECT *
   FROM table a
   WHERE NOT EXISTS (
      SELECT 1
      FROM table b
      WHERE b.username=a.username
      AND a.created_date>b.created_date
   )
) ilv
GROUP BY username, level
HAVING SUM(point) <= 5;

如何實現4取決於此約束相對於其他約束(特別是2和5)應用的確切順序。 以下應該從所述輸入中給出disred輸出...

SELECT username, level, SUM(point)
FROM 
(SELECT *
   FROM table a
   WHERE NOT EXISTS (
      SELECT 1
      FROM table b
      WHERE b.username=a.username
      AND a.created_date>b.created_date
   )
) ilv,
(SELECT username, SUM(point) as totpoint
  FROM table c
  GROUP BY username
  HAVING SUM(point)<=10) ilv2
WHERE ilv.username=ilv2.username
GROUP BY username, level
HAVING SUM(point) <= 5;

哎呀 - 再看一遍,看到你對輸出集中的級別細分不感興趣 - 在這種情況下,羅賓的答案更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM