2012-04-02 96 views
1

我有一个SQL查询的问题。 我需要获取用户列表。问题是我使用的left join。 这是我的查询如何从DB获得良好结果

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开发人员。

感谢先进。

回答

0

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

+0

我需要加入,我更新了我的查询。 – Ofer 2012-04-02 12:58:28

1

鉴于您没有为任何目的使用游戏,游戏动作或电子邮件(它们不会过滤用户,也不会使用这些表中的数据来丰富结果),因此无需加入这些表都:

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

我需要这个连接...查询的结尾是和email.type = 2 – Ofer 2012-04-02 12:47:46

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 
+0

对于'GROUP_CONCAT()'+1。 – glglgl 2012-04-02 12:45:19

+0

GROUP_CONCAT不起作用,我需要为它做点特别的事情吗? – Ofer 2012-04-02 12:59:45

+0

GROUP BY user_id将显示唯一用户,然后其他多个记录(具有相同的user_id)必须使用集合函数进行处理。我已经添加了GROUP_CONCAT作为示例,您可以使用另一个 - MAX,MIN,... – Devart 2012-04-02 13:54:02

0

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

相关问题