簡體   English   中英

不顯示我想要的內容進行內部加入和分組

[英]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.

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