2012-12-25 32 views
0

我花了幾天的時間來創建這個相當複雜的SQL語句,現在它給了我完全我想要的。現在我想知道是否有更好/更簡單的方法來做到這一點。另外的MySQL不會讓我CREATE VIEW這句話是否有可能通過多個子查詢和JOIN來簡化此SQL語句

SELECT name, a.user, liste, c.order, total_1kr, total_5kr, total_8kr, total_10kr, total_paid, differens, sbdato, spaid, sbreg, sfdato, sforbrug, sfreg 
FROM (SELECT t.user, t.paid AS spaid, t.dato AS sbdato, t.registrant AS sbreg FROM( 
    SELECT user,MAX(dato) AS maksdato 
    FROM g_kiosk_f WHERE paid!=0 
    GROUP BY user) AS x 
    JOIN g_kiosk_f AS t ON x.user =t.user 
    AND x.maksdato = t.dato) AS a 
JOIN (SELECT s.user, (s.1kr+(s.5kr)*5+(s.8kr)*8+(s.10kr)*10) AS sforbrug, s.dato AS sfdato, s.registrant AS sfreg FROM( 
    SELECT user,MAX(dato) AS maksdato 
    FROM g_kiosk_f WHERE 1kr!=0 OR 5kr!=0 OR 8kr!=0 OR 10kr!=0 
    GROUP BY user) AS y 
    JOIN g_kiosk_f AS s ON y.user=s.user 
    AND y.maksdato=s.dato) AS b 
JOIN (SELECT t1.name, t2.user, t1.liste, t1.order, sum(t2.1kr) AS total_1kr, sum(t2.5kr) *5 AS total_5kr, sum(t2.8kr) *8 AS total_8kr, sum(t2.10kr) *10 AS total_10kr, sum(t2.paid) AS total_paid, (sum(t2.1kr) + sum(t2.5kr) *5 + sum(t2.8kr) *8 + sum(t2.10kr) *10 - sum(t2.paid)) AS differens 
    FROM g_kiosk_users AS t1 
    INNER JOIN g_kiosk_f AS t2 ON t1.nr = t2.user 
    GROUP BY t2.user 
    ORDER BY t1.name ASC) AS c 
ON a.user=b.user AND a.user=c.user 

我有一個表 'g_kiosk_f' 包含ID(用戶),日期(日期),5個種類的交易(1KR,5kr,8kr,10kr,並支付)出納員(註冊人)。另一個表'g_kiosk_users'包含名稱和id(nr)。 我想展示

  1. 最新交易,其中支付日期,註冊和金額的結果集合!= 0
  2. 最新交易日期,註冊和金額,其中1KR!= 0,5kr!= 0, 8kr!= 0或10kr!= 0
  3. 總和的總差值(1KR + 5kr + 8kr + 10kr)和金額(支付)

所以結果應該是這個樣子

Name | id | difference | newest paid date | newest paid registrant | newest paid amount | newest kr date | newest kr registrant | newest kr amount | 

在上面我已經包含了手動進行差異計算所需的數字,因爲它在某個時刻需要,但現在已經過時。這是否有任何意義?

+0

請問這個部分「'FROM g_kiosk_f WHERE 1KR = 0或5kr = 0或8kr = 0或10kr! = 0''工作?標識符通常需要以非數字開頭,但顯然你可以用數字開始標識符。這是MySQL的擴展嗎? –

+0

由於MySQL不支持CTE(Common Table Expressions,又名'WITH子句'),所以沒有機會使用一個用於(幾乎)重複的子查詢'FROM(SELECT user,MAX(dato)AS maksdato FROM g_kiosk_f GROUP BY用戶)AS x JOIN g_kiosk_f AS t ON x.user = t.user AND x.maksdato = t.dato)AS a'。因爲有兩種稍微不同的過濾條件('WHERE paid!= 0'和'WHERE 1kr!= 0 OR 5kr!= 0 OR 8kr!= 0 OR 10kr!= 0'),所以你不清楚無論如何,都可以使用CTE。你可以做很多事情來改善這種狀況。這只是一個很大的混亂的查詢。 –

+0

您能否介紹一下您試圖獲得的更高級別的結果? – Himanshu

回答

0

現在看來似乎應該是可能重寫您查詢是這樣的:!!!

SELECT t1.name AS name, a.user AS user, t1.liste, t1.order, 
     SUM(t2.1kr) AS total_1kr, SUM(t2.5kr) * 5 AS total_5kr, 
     SUM(t2.8kr) AS total_8kr, SUM(t2.10kr) * 5 AS total_10kr, 
     SUM(52.paid) AS total_paid, 
     SUM(t2.1kr + 5 * tt.5kr + 8 * t2.8kr + 10 * t2.10kr) 
     -SUM(t2.paid) AS differens 
     a.dato AS sbdato, a.paid AS spaid, a.registrant as sbreg, 
     b.dato as sfdato, 
     (b.1kr+(b.5kr)*5+(b.8kr)*8+(b.10kr)*10) AS sforbrug, 
     b.registrant AS sfreg 
FROM g_kiosk_f AS a 
INNER JOIN (SELECT user, MAX(dato) FROM g_kiosk_f 
      WHERE paid != 0 
      GROUP BY user) AS a2 
ON a.user = a2.user AND a.dato = a2.dato 
INNER JOIN g_kiosk_f as b ON b.user = a.user 
INNER JOIN (SELECT user, MAX(dato) FROM g_kiosk_f 
      WHERE 1kr!=0 OR 5kr!=0 OR 8kr!=0 OR 10kr!=0 
      GROUP BY user) AS b2 
ON b.user = b2.user AND b.dato = b2.dato 
INNER JOIN g_kiosk_f as t2 ON t2.user = a.user 
INNER JOIN g_kiosk_users as t1 ON t1.nr = t2.user 
GROUP BY a.user 
ORDER BY name ASC 
+0

謝謝,這個作品。雖然我不確定這更簡單。 –

+0

也許這並不簡單,但希望它能更容易理解並可以從中看到。 –