如何从DB获得好的结果

时间:2012-04-02 12:39:03

标签: mysql sql oracle-sqldeveloper

我的SQL查询有问题。 我需要获得用户列表。问题是我使用left join。 这是我的查询

 SELECT  
u.*  
 FROM  
users u LEFT JOIN game g on g.user_id = u.user_id  
LEFT JOIN game_actions ga on ga.game_id = g.id  
LEFT JOIN emails e on e.id = ga.email_id
WHERE  
u.user_id = 0  
AND u.is_contact_by_email = 1 
    AND email.type = 2

由于与其他表的连接,此查询多次返回同一用户 我希望此查询只返回每个用户一次。 我正在使用sql developer。

先谢谢了。

4 个答案:

答案 0 :(得分:1)

鉴于您没有出于任何目的使用游戏,游戏活动或电子邮件(他们没有过滤用户,并且您没有使用这些表中的数据来丰富结果),因此无需加入这些几乎没有表格:

SELECT  
  u.*  
FROM users u
WHERE u.user_id = 0  
  AND u.is_contact_by_email = 1 

答案 1 :(得分:1)

您可以按user_id对结果进行分组,并使用aggregate functions返回其他字段,以获取eaxmple -

SELECT u.user_id, GROUP_CONCAT(g.game_id) games FROM users u
  LEFT JOIN game g
    ON g.user_id = u.user_id  
  LEFT JOIN game_actions ga
    ON ga.game_id = g.id  
  LEFT JOIN emails e
    ON e.id = ga.email_id
WHERE
  u.user_id = 0  AND u.is_contact_by_email = 1
GROUP BY
  u.user_id

答案 2 :(得分:0)

尝试使用与您的查询不同的关键字

答案 3 :(得分:0)

我想每个用户还有更多游戏,动作和电子邮件。你怎么想象结果表看起来像?因为当您仅从用户表(SELECT u.*)中进行选择时,加入其他表是没有意义的。如果您需要其他表,请使用GROUP BY (u.user_id)按用户对行进行分组。