多表查询

时间:2012-03-20 15:33:44

标签: mysql sql

我对MYSQL很新。我正在尝试编写一个将在多个表中搜索的查询,但它似乎只评估查询的第一个条件。我开发的查询是:

SELECT DISTINCT user.user_id, user_netid, user_firstname, user_lastname, 
    user_dmid, user_insnum, instype_id, user_birthday, user_insapproved 
FROM user, signup, event 
WHERE  (user.instype_id = 3 OR user.instype_id = 4) 
    AND signup.signup_attended =1 AND signup.signup_timestamp >= 1325376000 
    AND (event.activity_id=37 OR event.activity_id=40 OR event.activity_id=5);

我知道这很长,但就像我说的,我是新手,这是我能想到的最好的。在任何情况下,它似乎只评估user.instype_id,因为它给我记录signup.signup_attended!= 1或user.instype_id之后出现的任何其他条件。有人可以告诉我我做错了吗?

3 个答案:

答案 0 :(得分:0)

我的猜测是,由于您的交叉连接(带逗号的表列表......但没有连接语句),这种情况正在发生。基本上,您可以过滤掉具有inst类型的用户,但您仍然会向用户显示signup_attended,因为user表和signup表没有链接,所以它只是开始捣碎桌子在一起。也许wikipedia can explain a cross join better than I can :)

您需要使用JOIN

重写代码

以下是一个事后的示例(在连接列上猜测)

SELECT DISTINCT user.user_id, user_netid, user_firstname, user_lastname, 
    user_dmid, user_insnum, instype_id, user_birthday, user_insapproved 
FROM user
    JOIN signup
        ON signup.user_id = user.id
    JOIN event 
        ON event.signup_id = signup.id
WHERE  (user.instype_id = 3 OR user.instype_id = 4) 
    AND signup.signup_attended =1 AND signup.signup_timestamp >= 1325376000 
    AND (event.activity_id=37 OR event.activity_id=40 OR event.activity_id=5);

在SQL JOIN上执行google,您应该获得一些解释此信息的信息。 Here is one tutorial

答案 1 :(得分:0)

这里有一些事情需要修复。您访问的每个值都需要与表关联。您的第一个值“user.user_id”可以正常工作,但其余值与表格无关。(如果这有意义的话)。

您能否提供正在使用的表的布局。

答案 2 :(得分:0)

使用语法:

select * from user
join signup on user.userPrimaryKey=signup.userForeignKey
where conditions...

或:

select * from user,signup
where user.userPrimaryKey=signup.userForeignKey AND condition...

就像Marc B说你做笛卡尔连接(表的每一行都会关联到另一个表的所有行)