MySQL: объединить две таблицы - PullRequest
0 голосов
/ 02 июля 2010

У меня проблемы с дизайном правильного SQL-запроса.Я устал как черт сегодня, работаю над 12 часами (крайний срок скоро) и не могу найти проблему ...

Таблицы:

buddies | userid | buddyid
users | id | username

Теперь, что я хотел быdo: Запросить друзей в таблице для всех друзей пользователя (когда ID = идентификатор пользователя ИЛИ ID = buddyid).С этим проблем не возникает.

Проблема возникает, когда я пытаюсь присоединиться к таблице пользователей, чтобы получить имя пользователя, имя пользователя равно NULL, не могу понять, почему.1010 *

Вот рабочий запрос (но возвращается пустое имя пользователя)

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

Заранее спасибо за любую помощь.Я более чем уверен, что это крошечная ошибка (вызванная мной), но на самом деле не могу ее найти.Потратил на это больше часа, потом решил спросить.

С уважением, Том

Ответы [ 5 ]

3 голосов
/ 02 июля 2010

думаю, что это цитаты, попробуйте это:

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

Во-вторых, ваше условие Где не имеет смысла.Если вы хотите, чтобы появилось только одно имя, вы можете ограничить его до userid = 1 или buddyId = 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
1 голос
/ 02 июля 2010

Миниатюрная ошибка в том, что вы используете неверные кавычки в состоянии ВКЛ.

изменить

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

на

 `users`.`id` = `buddyid` OR `users`.`id` = `userid` 
0 голосов
/ 02 июля 2010

Как заметили другие люди, вы используете неправильные кавычки.

Символ ' предназначен для цитирования строк, а не объектов.Итак, вы делаете пару сравнений строк. строка 'user.id' никогда не будет равна строка 'buddyid' и то же самое для вашего другого сравнения, поэтому запрос ничего не возвращает.

Для цитирования объектов (таблиц, столбцы и т. д.) Вы должны использовать символ обратной кавычки `.

Вы должны заключать в кавычки объекты, только если объект назван так же, как зарезервированное слово или содержит нестандартные символы (пробелы и тому подобное),Таким образом, в этом запросе ни один из символов кавычки фактически не требуется.

ИМО, если вы должны процитировать объект, это хороший признак того, что вы не должны использовать это конкретное имя.

0 голосов
/ 02 июля 2010

Теперь все это заметили, не так ли?

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

В чем вообще смысл всех этих "знаков"?

0 голосов
/ 02 июля 2010

Почему вы используете `символ для имен объектов?

SELECT username 
FROM users_buddies    
LEFT JOIN users ON ( users.id = 'buddyid' 
OR users.id = 'userid' ) 
WHERE userid =1 
OR buddyid =1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...