оставленный вопрос внешнего соединения - PullRequest
1 голос
/ 09 сентября 2011

У меня есть три таблицы для управления различными учетными записями в социальных сетях - facebook, twitter и linkedin. следующий запрос вернет аккаунты в фейсбуке, но ничего больше - что я делаю не так? каждая таблица связана через поле user_id, но каждая запись также имеет свое поле идентификатора.

SELECT 
  bla_facebook_accts.id as facebook, 
  bla_linked_in_accts.id as linkedin, 
  bla_twitter_accts.id as twitter  
FROM
  bla_facebook_accts 
  LEFT OUTER JOIN
    bla_linked_in_accts 
    ON
      (bla_linked_in_accts.user_id = bla_facebook_accts.user_id)
  LEFT OUTER JOIN 
    bla_twitter_accts
    ON
      (bla_linked_in_accts.user_id = bla_twitter_accts.user_id) 
WHERE bla_facebook_accts.user_id = '12';

любые идеи, где я ошибаюсь - я просто хочу, чтобы он возвращал строку, если у пользователя есть учетная запись в каждой сети, т.е. запись в каждой таблице

Ответы [ 6 ]

2 голосов
/ 09 сентября 2011

Проблема с вашим запросом заключается в том, что если у пользователя нет учетной записи Facebook, вы не получите никакой информации об этом пользователе.А если у пользователя нет аккаунта на linkedin, вы не получите информацию о его аккаунте в твиттере.ЛЕВЫЕ СОЕДИНЕНИЯ не подходят для этой цели, но MySQL не поддерживает FULL OUTER JOINS, поэтому в качестве обходного пути вы можете сделать что-то вроде этого:

select
    (select id from bla_facebook_accts where user_id = user.user_id) as facebook,
    (select id from bla_linked_in_accts where user_id = user.user_id) as linkedin,
    (select id from bla_twitter_accts where user_id = user.user_id) as twitter
from
    (select 12 user_id) user
1 голос
/ 09 сентября 2011

Если вы хотите перечислить все существующие учетные записи для данного пользователя, независимо от того, сколько учетных записей у этого пользователя, LEFT JOIN (он же LEFT OUTER JOIN) - правильный путь, но вы должны присоединиться к тому, что, как вы знаете,существуют для всех пользователей.Поэтому вы должны основывать свой запрос на своей пользовательской таблице и объединить все таблицы на user_id в пользовательской таблице.

Переименовать userTable во что бы то ни было, ваша пользовательская таблица называется

SELECT
    facebook.id as facebook,
    linkedin.id as linkedin,
    twitter.id as twitter
FROM
    userTable
LEFT JOIN
    bla_facebook_accts facebook ON (userTable.user_id = facebook.user_id)
LEFT JOIN
    bla_linked_in_accts linkedin ON (userTable.user_id = linkedin.user_id)
LEFT JOIN
    bla_twitter_accts twitter ON (userTable.user_id = twitter.user_id)
WHERE
    userTable.user_id = 12
1 голос
/ 09 сентября 2011

После комментария об отсутствии учетной записи FB:

(SELECT 'Facebook' as 'ac', id FROM bla_facebook_accts WHERE user_id=12)
UNION
(SELECT 'LinkedIn' as 'ac', id FROM bla_linked_in_accts WHERE user_id=12)
UNION
(SELECT 'Twitter' as 'ac', id FROM bla_twitter_accts WHERE user_id=12)
1 голос
/ 09 сентября 2011

Я думаю, что вы хотите использовать INNER JOIN s, если хотите вернуть строку с записью во всех таблицах.

SELECT
  f.id as facebook, 
  l.id as linkedin, 
  t.id as twitter
FROM
  bla_facebook_accts f
  INNER JOIN bla_linked_in_acctsn l ON f.user_id = l.user_id 
  INNER JOIN bla_twitter_accts t ON f.user_id = t.user_id
0 голосов
/ 09 сентября 2011

Вы никогда не получите ответ, если попытаетесь выполнить второе присоединение с помощью идентификатора linkedin, если у вашего пользователя нет учетной записи linkedin, но есть учетная запись Facebook. Вы всегда должны присоединиться, используя исходную учетную запись (facebook)

SELECT 
  bla_facebook_accts.id as facebook, 
  bla_linked_in_accts.id as linkedin, 
  bla_twitter_accts.id as twitter  
FROM
  bla_facebook_accts 
  LEFT OUTER JOIN
    bla_linked_in_accts 
    ON
      (bla_linked_in_accts.user_id = bla_facebook_accts.user_id)
  LEFT OUTER JOIN 
    bla_twitter_accts
    ON
      (bla_linked_in_accts.user_id = bla_facebook_accts.user_id) 
WHERE bla_facebook_accts.user_id = '12';
0 голосов
/ 09 сентября 2011

попробовать:

Выберите t1.column, t2.column, t2.column из левого внешнего соединения таблицы (t1, t2, t3) на (t1.user_id = table.user_id AND t2.user_id = table.user_id AND t3.user_id = table .user_id)

и т.д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...