[英]Inner-Join and group by not showing what I want
我有以下表格...請參閱下文
table users:
-------------
| id | name |
-------------
| 1 | mike |
| 2 | john |
| 3 | bill |
-------------
table trans:
---------------
| uid | spent |
---------------
| 1 | 5.00 |
| 1 | 6.00 |
| 2 | 5.00 |
| 3 | 5.00 |
| 3 | 10.00 |
---------------
expected output:
----------------------------
| id | name | spent | spent |
----------------------------
| 1 | mike | 5.00 | 6.00 |
| 2 | john | 5.00 | null |
| 3 | bill | 5.00 | 10.00 |
----------------------------
我正在使用以下查詢...
SELECT d.id, d.name, m.spent
FROM users d
INNER JOIN trans m
ON d.id = m.uid GROUP BY id;
但這並沒有告訴我我想要的是什么,有人幫忙...
我嘗試了以下代碼...看起來我很近,但還沒到那兒...。
SELECT d.id, d.name, m.spent
IF (m.id=5.00, 'spent', '') AS spent,
IF (m.id=6.00, 'spent1', '') AS spent1
FROM users d
INNER JOIN trans m
ON d.id = m.uid GROUP BY id;
一些想法...
有兩種簡單的方法可以獲取corrcet版本:
SELECT d.id, d.name, sum(m.spent)
FROM users d
INNER JOIN trans m
ON d.id = m.uid GROUP BY (d.id, d.name)
ORDER BY d.id;
你會得到
----------------------
| id | name | spent |
----------------------
| 1 | mike | 11.00 |
| 2 | john | 5.00 |
| 3 | bill | 15.00 |
----------------------
要么
SELECT d.id, d.name, m.spent
FROM users d
INNER JOIN trans m
ON d.id = m.uid
ORDER BY d.id;
你會得到
----------------------
| id | name | spent |
----------------------
| 1 | mike | 5.00 |
| 1 | mike | 6.00 |
| 2 | john | 5.00 |
| 3 | bill | 5.00 |
| 3 | bill | 10.00 |
----------------------
為了獲得輸出,您必須自動創建新的列。 那不是在數據庫中進行分析的好方法,而且非常罕見。 每當“邁克”或其他人花費新東西時,必須更新其他視圖中的選擇語句。
編輯:第一個視圖為您提供了每個用戶的摘要支出。 第二個視圖為您提供每筆支出,並在旁邊帶有用戶名。
您的主要困難在於,對於相同的ID,您可能只有一個或兩個條目。 這不僅意味着我們需要對事物進行“計數”,而且還意味着我們必須確定“第一”和“第二”行(請記住表是無序集合)。
以某種方式很難推斷出您要構建結果表的方式(確切地說,是如何區分“左”和“右”花費的列)。 假設這是“最小”和“最大”:
select uid, spent as s1, NULL as s2 from trans group by uid having count(*) = 1
union select t1.uid, t1.spent, t2.spent from trans as t1 join trans as t2
on t1.uid = t2.uid and t1.spent < t2.spent;
生產:
+------+------+-------+
| uid | s1 | s2 |
+------+------+-------+
| 2 | 5.00 | NULL |
| 1 | 5.00 | 6.00 |
| 3 | 5.00 | 10.00 |
+------+------+-------+
關於您的第一個問題,我們只是在“一個JOIN
”的理想結果:
select users.id, users.name, S.* from users join
(
select uid, spent as s1, NULL as s2 from trans group by uid having count(*) = 1
union select t1.uid, t1.spent, t2.spent from trans as t1 join trans as t2
on t1.uid = t2.uid and t1.spent < t2.spent;
) AS S
ON users.id = S.uid
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.