2012-08-30 84 views
0

在教程中,我看到这个SQL查询:SQL - JOIN复杂查询

SELECT a.id as a_id, a.info as a_info, 
     b.id as b_id, b.info as b_info 
FROM stats AS a 
JOIN stats as b 
ON a.id != b.id 
LIMIT 25 

查询运作良好,但现在我需要添加WHERE条件。我有表users。表stats包含列user_id。 我尝试从表stats如果users.city=1(例如)获得所有用户,但我仍然无法找到一种方法,如何实现这一目标?

我的问题是,我目前还没有线索,如何在查询中放入另一个JOIN(表users)。

我会为每一个建议表示感谢,谢谢

+0

你想完成什么?该查询并非真正有用,或者看起来如此。 –

回答

1

那么,你使用表stats两次在你的查询中,你实际上也需要两个连接users表。 (对于统计A和统计B)

SELECT a.id as a_id, a.info as a_info, 
     b.id as b_id, b.info as b_info 
FROM stats AS a 
JOIN stats AS b ON a.id != b.id 
JOIN users AS a_users ON a.user_id = a_users.id 
JOIN users AS b_users ON b.user_id = b_users.id 
WHERE a_users.city = 1 
    OR b_users.city = 1 
LIMIT 25 
+0

谢谢!只是 - 'WHERE a_users.city = 1 或b_users.city = 1'为什么没有'AND'? – user984621

+0

@ user984621如果您使用“AND”或“OR”取决于您想要选择的数据集。 – Kaii

1

因此,这是你有什么...

这是你回来什么

SELECT a.id as a_id, a.info as a_info, b.id as b_id, b.info as b_info 

这是从何而来从

FROM stats AS a 
JOIN stats as b on a.id != b.id 

这是多少你想

LIMIT 25 

所以,如果你想添加的用户表,其他的以后添加此加入

JOIN users ON a.user_id = users.id 

,并对其进行过滤,加入这个连接

WHERE users.city=1 

发出后

SELECT a.id as a_id, a.info as a_info, b.id as b_id, b.info as b_info 
FROM stats AS a 
JOIN stats as b on a.id != b.id 
JOIN users ON a.user_id = users.id 
WHERE users.city=1 
LIMIT 25 
+0

感谢您的消息。我会有一个问题 - 不应该在那里而不是'JOIN用户在a.user_id = users.id'上:'JOIN用户在a.user_id = users.id和b.user_id = users.id' - 因为我可能需要来自同一城市的两个项目('a'和'b') – user984621

+0

。这取决于你想要什么。您可能需要加入两组用户表,因为a和b可能有不同的用户? – podiluska

1

为了方便起见,我已经重新格式化了原始SQL语句以使其人类可读。

SELECT a.id AS a_id 
    , a.info AS a_info 
    , b.id AS b_id 
    , b.info AS b_info 
    FROM stats a 
    JOIN stats b 
    ON a.id != b.id 
LIMIT 25 

您当前的查询几乎返回笛卡尔积。来自统计数据的每一行都与统计数据中的每一行进行匹配,除了匹配自身。 (假设stats.id是主键或唯一键。)

要添加一个连接到用户表,限制行从a返回,例如:

SELECT a.id AS a_id 
    , a.info AS a_info 
    , b.id AS b_id 
    , b.info AS b_info 
    FROM stats a 
    JOIN users au ON au.id = a.user_id AND au.city=1 
    JOIN stats b ON a.id != b.id 
LIMIT 25 

如果要限制返回的行两个ab,再添加入到users表:

SELECT a.id AS a_id 
    , a.info AS a_info 
    , b.id AS b_id 
    , b.info AS b_info 
    FROM stats a 
    JOIN users au ON au.id = a.user_id AND au.city=1 
    JOIN stats b ON a.id != b.id 
    JOIN users bu ON bu.id = b.user_id AND bu.city=1 
LIMIT 25 

这是不是为了实现这一目标的唯一途径。例如,您可以使用a.user_id IN (subquery)或​​谓词。

(如果您使用可读的格式进行格式化,SQL更容易使用。)

1

下面是做到这一点的一种方法:

SELECT a.id as a_id, a.info as a_info, 
     b.id as b_id, b.info as b_info 
FROM stats AS a 
JOIN stats as b 
    ON a.id != b.id 
where a.user_id in (select user_id from users where users.city = 1) 
LIMIT 25 

你也可以使用这个作为连接(这在MySQL是更有效):

SELECT a.id as a_id, a.info as a_info, 
     b.id as b_id, b.info as b_info 
FROM stats AS a 
JOIN stats AS b 
    ON a.id != b.id 
JOIN users AS u 
    ON a.user_id = u.user_id 
    AND u.city_id = 1 
LIMIT 25