是否可以使用多个子查询和JOIN简化此SQL语句

时间:2012-12-25 01:23:55

标签: mysql sql database

我花了几天时间创建了这个相当复杂的SQL语句,它现在给了我我想要的东西。现在我想知道是否有更好/更简单的方法来做到这一点。 MySQL也不会让我在这个声明中创建视图

 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

我有一个包含id(用户),日期(dato),5种交易(1kr,5kr,8kr,10kr和付费)的收银员(注册人)的'g_kiosk_f'表。另一个表'g_kiosk_users'包含name和id(nr)。 我想要一个结果集显示

  1. 支付日期,注册人和最新交易金额!= 0
  2. 最新交易的日期,注册人和金额,其中1kr!= 0,5kr!= 0,8kr!= 0或10kr!= 0
  3. 总和(1kr + 5kr + 8kr + 10kr)和总和(支付)之差
  4. 所以结果看起来应该像

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

    在上面我已经包含了手动进行差异计算所需的数字,因为它在某些时候需要,但现在已经过时了。这些都有意义吗?

1 个答案:

答案 0 :(得分: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