2010-07-02 122 views
0

我遇到了设计正确的SQL查询问题。我已经厌倦了像今天这样一个地狱,已经(即将截止日期)工作超过12个荷鲁斯,并不能找到问题......MySQL:加入两个表

表:

buddies | userid | buddyid 
users | id | username 

现在,我想做什么: 查询所有用户朋友的表伙伴(当ID = userid OR ID = buddyid时)。没有问题。

问题出现在我尝试加入用户表以获取用户名时,用户名为NULL,找不到原因。

你想帮我吗?

这里的工作查询(但返回空的用户名)

SELECT username 
FROM (
`users_buddies` 
) 
LEFT JOIN `users` ON ('users.id' = 'buddyid' 
OR 'users.id' = 'userid') 
WHERE `userid` =1 
OR `buddyid` =1 

预先感谢任何帮助。我确定这是一个小错误(由我引起),但实际上找不到它。花了一个多小时,然后决定问。

问候, 汤姆

回答

1

微小的错误是,你是在ON状态下使用不正确的报价

变化

'users.id' = 'buddyid' OR 'users.id' = 'userid' 

`users`.`id` = `buddyid` OR `users`.`id` = `userid` 
3

认为它的报价,试图这个:

SELECT username 
    FROM users_buddies ub 
     LEFT JOIN users u 
     ON u.id In (ub.userId, ub.buddyid) 

其次,您的Where条件没有意义。如果你只是想来一个名字了,那么你可以把它限制在userid = 1buddyId = 1 ..(这是同一个用户,无论他是在user_buddies用户,或在user_buddies好友)

如果你想要的是找到与userid = 1用户的所有好友,那就试试这个:

SELECT b.username 
    FROM users_buddies ub 
     LEFT JOIN users b 
     ON b.id = ub.buddyid 
    Where ub.userid = 1 

,甚至更好,

Select u.username User, b.username Buddy 
    From users_buddies ub 
     LEFT JOIN users u 
     ON u.id = ub.userid 
     LEFT JOIN users b 
     ON u.id = ub.buddyid   
    Where ub.userid = 1 
0

你为什么用'字符对象的名字呢?

SELECT username 
FROM users_buddies  
LEFT JOIN users ON (users.id = 'buddyid' 
OR users.id = 'userid') 
WHERE userid =1 
OR buddyid =1 
0

现在大家都已经发现了,不是这个吗?

SELECT username 
    FROM users_buddies LEFT JOIN 
     users ON (users.id = buddyid OR users.id = userid) 
    WHERE userid = 1 OR 
      buddyid = 1; 

无论如何,所有这些“标记”的想法是什么?

+1

http://dev.mysql.com/doc/refman/5.0/en/identifiers.html – 2010-07-02 13:09:16

+0

当然,Naktibalda是对的。 – Tom 2010-07-02 13:15:29

+0

谢谢,jsummers。或许,我认为在这种情况下,最好不要为表名使用保留字。 – 2010-07-02 18:54:24

0

正如其他人所观察到的,您正在使用错误的引号。

'字符用于引用字符串,而不是对象。所以,你正在做一对字符串比较。字符串'user.id'将永远不会等于字符串'buddyid',以及您的其他比较的同上,所以查询不会返回任何内容。

对于引用对象(表,列等),您必须使用反引号字符`。

如果对象的名称与保留字相同或者包含非标准字符(空格等),则只需引用对象。所以,在这个查询中,实际上不需要任何引号字符。

IMO,如果你必须引用一个对象,这是一个好兆头,你不应该使用这个特定的名称。

+0

是的,我知道......但谢谢你的回答。 – Tom 2010-07-02 13:15:05