Внутреннее объединение возвращает только 7 записей - PullRequest
0 голосов
/ 03 ноября 2010

У меня есть таблица с 500.000 записей, заполненных обновлениями в Твиттере. Тогда у меня есть таблица с информацией о пользователе.

Мне нужны все записи в Твиттере людей из моей таблицы пользователей.

Я могу сделать это с помощью запроса SELECT IN:

SELECT *
FROM STATUS WHERE twitterUserID
IN (    
    SELECT twitteruserid
    FROM accountLink
)

Но это, очевидно, очень медленно.

Затем я попытался сделать это с помощью объединения, но оно показывает только 7 записей. Понятия не имею, почему.

SELECT status . * , accountLink.userId, accountLink.twitterUserId
FROM status
JOIN accountLink
ON status.twitterUserId = accountLink.twitterUserId

Кто-нибудь знает, что может вызвать такое поведение и как его решить?

Ответы [ 3 ]

1 голос
/ 03 ноября 2010

Попробуйте изменить это на:

SELECT status.* , accountLink.userId, accountLink.twitterUserId
FROM status
LEFT JOIN accountLink
ON status.twitterUserId = accountLink.twitterUserId

Я подозреваю, что нет совпадений для всех записей между статусом и ссылкой на аккаунт. Выполнение левого соединения будет выбирать каждый status независимо от того, есть ли у accountLink совпадение.

0 голосов
/ 05 ноября 2010
SELECT s.*, a.twitterUserId, a.userId
FROM status AS s INNER JOIN accountLink AS a
WHERE s.twitterUserId=a.twitterUserId

Вы действительно хотите использовать внутреннее объединение, потому что вы хотите возвращать результаты, только если в таблице «status» есть запись И соответствующая запись пользователя найдена в таблице «accountLink».Если запись таблицы «статус» НЕ имеет соответствующей записи пользователя, вы не должны отображать ее (по крайней мере, согласно вашему сообщению).LEFT OUTER JOIN будет отображать записи таблицы состояния, даже если в таблице accountLink не было соответствующей записи.

Вот отличный ресурс для изучения объединений SQL:
Соединения SQL (w3schools.com)

0 голосов
/ 03 ноября 2010

Синтаксис JOIN должен работать, если типы данных столбца не отличаются.

В соответствии с Документация MySQL для IN () :

ПоискЗатем элемент выполняется с помощью бинарного поиска.Это означает, что IN очень быстр, если список значений IN полностью состоит из констант.В противном случае преобразование типов выполняется в соответствии с правилами, описанными в разделе 11.2 «Преобразование типов в оценке выражений», но применяется ко всем аргументам.

Обеспечение соответствия типов столбцов должно гарантировать, что JOINсинтаксис работает правильно.

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