Проблема соединения таблиц с MySQL - PullRequest
1 голос
/ 16 декабря 2011

У меня есть таблица для приглашенных пользователей (содержит адрес электронной почты и столбцы с датами) и таблица для пользователей.

Я запускаю, чтобы получить лучших рефереров:

SELECT count(r.Email) as count, r.Email 
FROM refs r 
WHERE r.referredOn > '2011-12-13' 
GROUP BY email 
ORDER BY count DESC

Но яЯ хочу объединить это с таблицей пользователей, чтобы она отображалась вместе с другими данными в таблице пользователей. Я думал, что объединение будет работать.Левое присоединение, потому что электронные письма могут быть введены неправильно, некоторые люди вводят имя и т. Д. Под refs.Email

SELECT count(r.Email) as count, r.Email, u.* 
FROM refs r LEFT JOIN users u ON u.email_primary = r.Email 
WHERE r.referredOn > '2011-12-13' 
GROUP BY email 
ORDER BY count DESC

С помощью вышеупомянутого запроса число неверно, но я не знаю почему.

Ответы [ 4 ]

1 голос
/ 16 декабря 2011

Попробуйте это:

SELECT count(r.Email) as count, r.Email 
FROM refs r 
INNER JOIN users u ON u.email_primary = r.Email 
WHERE r.referredOn > '2011-12-13' 
GROUP BY email 
ORDER BY count DESC

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

Привет

0 голосов
/ 16 декабря 2011

Я написал этот запрос

SELECT *, count(r.Email) as count FROM refs r 
LEFT OUTER JOIN users u ON r.email = u.email_primary
WHERE u.uid IS NOT NULL
GROUP BY u.uid
ORDER BY count DESC

Это показало мне, что причина неправильного подсчета была в том, что некоторые из адресов электронной почты дважды использовались в таблице пользователей (пользователи, разделяющие адрес электронной почты «семьи»), это удвоило мой счет, приведенный выше запрос показывает каждую отдельную учетную запись ,

0 голосов
/ 16 декабря 2011

СМОТРИ, если это поможет тебе:

SELECT e.count, e.email, u.col1, u.col2 -- etc
FROM (
    SELECT count(r.Email) as count, r.Email 
    FROM refs r 
    WHERE r.referredOn > '2011-12-13' 
    GROUP BY email 
) e 
INNER JOIN 
users u ON u.email_primary = e.Email 

Вместо прямого объединения вы можете ПОПРОБОВАТЬ использовать свой счетный запрос в качестве типа таблицы подзапроса.

0 голосов
/ 16 декабря 2011

К сожалению, левое соединение не поможет вам здесь;Этот тип объединения говорит мне, что я получаю все строки пользователей, которые соответствуют моей электронной почте, а также все строки, которые не совпадают в электронной почте.Если электронное письмо не совпадает, то оно не будет возвращаться так, как вы хотите.

Таким образом, вы не можете использовать условие левого соединения здесь так, как вам нужно.

Если вы принудительно применилиТак как им приходилось каждый раз вводить адрес электронной почты, и это был действительный адрес электронной почты и т. д., вы можете использовать INNER JOIN.

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

Джефт Этвуд имеет хорошее объяснение того, как работают объединения.

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