SQL - 根据不同表中的字段选择列

时间:2014-02-04 18:47:33

标签: mysql sql

Table users:  
    username  email                is_active
    ========  =====                =========
    john      john@something.com   1
    jane      janesomething.com    1
    bob       bobsomething.com     0

Table students:  
    username  class_number
    ========  =====
    john      1
    jane      2
    bob       1

如何选择活跃(is_active == 1)和#1类(class_number == 1)的用户(在我的示例中,获取john)?

我试过

  

SELECT * FROM users,students WHERE users.is_active = 1 AND students.class_number = 1

但是这给了我“致命错误:允许的内存大小为94371840字节耗尽(试图分配512字节)”。

2 个答案:

答案 0 :(得分:1)

您需要使用连接条件。如果没有查询返回笛卡尔积,这在大多数情况下都不是您想要的,并且可能是非常昂贵的操作,具体取决于行数。

根据您的情况尝试一下:

SELECT
   u.username

FROM
    users u JOIN students s ON u.username = s.username

WHERE
    u.is_active = 1
AND
    s.class_number=1

答案 1 :(得分:0)

在SQL的大多数方言中,您可以通过以下两种方式之一进行内部联接:

SELECT * 
FROM 
    users,
    students 
WHERE 
    users.username = students.username --JOIN CONDITION
    AND users.is_active=1 
    AND students.class_number=1

SELECT * 
FROM 
    users 
    INNER JOIN students ON users.username = students.username --JOIN CONDITION
WHERE 
    users.is_active=1 
    AND students.class_number=1

如果您要使用第一种语法,您应该查看Joins的MySQL文档(截至发布时为http://dev.mysql.com/doc/refman/5.0/en/join.html)并阅读警告。如果您使用逗号而忘记了连接条件,那么您将(如上面的注释所示)获得M * N记录的笛卡尔连接,其中M是users表中的记录数,N是记录数在学生表中。 (这通常称为交叉连接。)如果将连接条件添加到WHERE子句,那么您将只获得两列具有相同值的M * N记录。

INNER JOIN语法执行相同的操作,但它使users.username = students.username条件显式为连接条件,如果忘记连接条件,则会抛出错误。逗号和INNER JOIN表单之间的优先顺序是不同的,因此通常只要有外部联接,您将需要使用INNER JOIN表单和INNER JOIN表单。

如果这对你没有任何意义,你应该看看有关Join(SQL)的维基百科文章。