2015-10-17 51 views
0

指望我有以下查询:SQL - 选择DISCINT并从联接查询

SELECT u.* 
     (SELECT sum(trs.amount) 
     FROM transactions trs 
     WHERE u.id = trs.user AND trs.type = 'Recycle' AND 
       trs.TIME >= UNIX_TIMESTAMP(CURDATE()) 
     ) as amt 
    FROM (SELECT DISTINCT user_by 
      FROM xeon_users_rented 
     ) AS xur JOIN 
     users u 
     ON xur.user_by = u.username 
     LIMIT 50 

从我的数据库中选择一些数据。上述查询工作正常。不过,我想xeon_users_rented选择count(*)其中user_by = u.username这是我曾尝试:

SELECT u.* 
     (SELECT sum(trs.amount) 
     FROM transactions trs 
     WHERE u.id = trs.user AND trs.type = 'Recycle' AND 
       trs.TIME >= UNIX_TIMESTAMP(CURDATE()) 
     ) as amt, 
     (SELECT DISTINCT count(*) 
      FROM xeon_users_rented 
     WHERE xur.user_by = u.username 
     ) AS ttl 
    FROM (SELECT DISTINCT user_by 
      FROM xeon_users_rented 
     ) AS xur JOIN 
     users u 
     ON xur.user_by = u.username 
     LIMIT 50 

但是,这给了我在xeon_users_rentedttl行数 - 不总明显行在哪里username = user_by

+0

您是否试过SELECT COUNT(DISTINCT(user_by)) – Neo

+1

如果您愿意,请考虑遵循以下简单的两步操作步骤:1.如果您尚未这样做,请提供适当的CREATE和INSERT语句(和/或一个sqlfiddle),这样我们可以更容易地复制问题。 2.如果您尚未这样做,请提供与步骤1中提供的信息相对应的所需结果集。 – Strawberry

回答

0

我认为你可以做你想做的事情,只需稍微修改你的子查询。也就是说,改变select distinctgroup by

SELECT u.*, xur.cnt, 
     (SELECT sum(trs.amount) 
     FROM transactions trs 
     WHERE u.id = trs.user AND trs.type = 'Recycle' AND 
       trs.TIME >= UNIX_TIMESTAMP(CURDATE()) 
     ) as amt 
FROM (SELECT user_by, COUNT(*) as cnt 
     FROM xeon_users_rented 
     GROUP BY user_by 
    ) xur JOIN  
    users u 
    ON xur.user_by = u.username 
LIMIT 50; 

一些注意事项:

  • SELECT DISTINCT是不是真的有必要,因为你可以做使用GROUP BY相同的逻辑。所以,了解GROUP BY更重要。
  • 您正在使用LIMIT没有ORDER BY。这意味着每次运行查询时都可以获得一组不同的行。糟糕的做法。