Mysql 多表查询

Mysql 多表查询,mysql,sql,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.insty

我是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_参与的记录=1或出现在user.instype_id之后的任何其他条件。有人能告诉我我做错了什么吗?

我猜这是因为您的表交叉连接列表带有逗号…但没有连接语句。基本上,您可以过滤出inst类型的用户,但是您仍然会显示注册用户,因为用户表和注册表没有链接,所以它只是开始将表混合在一起。也许吧

您需要使用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连接上执行google,您应该会得到一些解释这一点的信息

这里有几件事需要解决。您正在访问的每个值都需要与一个表关联。您的第一个值user.user_id起作用,但其余值不与表关联。如果有意义的话

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

请使用语法:

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


就像Marc B所说的那样,进行笛卡尔连接时,表中的每一行都将与另一个表中的所有行相关联

您应该将查询重写为正确的连接类型语法。现在,您正在从3个表中进行选择,但没有指定表之间的任何关系,因此以笛卡尔连接结束,这将给您带来许多糟糕的结果。欢迎使用堆栈溢出!我总是想提醒新用户,表示赞赏的方式是在你获得20个信誉点后通过向上投票,并在答案旁边打勾接受答案。如果您有任何问题,请参阅,特别是“好的”,这更有意义。谢谢我已经用这种格式重新编写了我的查询。然而,现在只找到了一条记录,我知道肯定有不止一条记录符合这些条件。我试着去掉DISTINCT,但得到了相同的结果。现在看起来是这样的:选择user.user\u id,user\u netid,user\u firstname,user\u lastname,user\u dmid,user\u insnum,instype\u id,user\u birth,用户注册已从注册时的用户加入注册中批准。用户注册id=用户注册时的用户注册id加入计划。计划注册id=计划。计划注册id加入事件。事件注册id=计划。事件注册id=其中user.instype\u id=3或user.instype\u id=4和signup.signup\u出席=1和signup.signup\u时间戳>=1325376000和event.activity_id=37或event.activity_id=40或event.activity_id=5;查询本身现在看起来很合理。您必须在问题中提供一些示例数据,使用SQLFiddle.com,这可能很难设置多个表,或者我在调试类似问题时使用的方法是开始逐个删除过滤器,直到获得更多结果。这至少会告诉你什么过滤器太严格了。这包括将一些JOIN语句转换为LEFT JOIN,因为这里的连接可能过于严格。如果你不确定google for LEFT JOIN会做什么,那么google for LEFT JOIN应该会澄清:好的,我会试试看。谢谢你的帮助!
select * from user,signup
where user.userPrimaryKey=signup.userForeignKey AND condition...