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字节)”。
答案 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)的维基百科文章。