[英]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
----------------------------------------------
查詢的要求是查詢(盡可能在一個查詢中)用戶名,表的點。
輸出樣本:
--------------------
username | tpoint|
--------------------
name_d | 8 |
name_b | 5 |
name_a | 3 |
--------------------
name_e
和name_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.