2013-12-17 3 views
3

Привет, ребята, у меня проблема с запросом mysql. Я отправляю информационные бюллетени.MySQL Присоединяйтесь к новостям

Моя MySQL схема выглядит как follwing http://sqlfiddle.com/#!2/178b7/18

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

Для каждого List_ID в LISTS ПРИНИМАЙТЕ каждый base_id из lists_mailbases, а затем подсчитайте все base_id, которые находятся в базе данных электронной почты.

Например, в моем списке схем1 должно быть 4 получателя, в списке 2 должно быть 2 получателя.

я написал что-то вроде этого:

SELECT l.id, COUNT(*) FROM lists l 
JOIN lists_mailbases lm ON l.id = lm.list_id 
JOIN email_database ed ON ed.base_id = lm.base_id 
GROUP BY l.id; 

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

+0

Я думаю, что вы пытаетесь выполнить COUNT (DISTINCT ed.base_id), проверьте мой ответ –

ответ

1

хороший вопрос с SQLFiddle!

просто добавить ed.base_id к вашему GROUP BY

SELECT l.id,ed.base_id, COUNT(*) , GROUP_CONCAT(ed.email) 
    FROM lists l JOIN lists_mailbases lm ON l.id = lm.list_id 
    JOIN email_database ed ON ed.base_id = lm.base_id 
    GROUP BY l.id,ed.base_id; 

ваших lists_mailbases повторил данные, кстати, у него есть 2 строки с одинаковым BASE_ID.

, если ваши данные правильно, и вы хотите подсчитать DISTINCT BASE_ID, просто сделать COUNT(DISTINCT base_id) , как показано ниже

SELECT l.id, COUNT(DISTINCT ed.base_id) , GROUP_CONCAT(ed.email) 
    FROM lists l JOIN lists_mailbases lm ON l.id = lm.list_id 
    JOIN email_database ed ON ed.base_id = lm.base_id 
GROUP BY l.id; 
1

Как вы сказали, что вы получаете в два раза больше, чем вы ожидаете, это выглядит как один из joins создает более одной записи для соединения. Диагностируйте это.

SELECT ID, COUNT(*) 
FROM 
(
    SELECT l.id, ED.BASE_ID FROM lists l 
    JOIN lists_mailbases lm ON l.id = lm.list_id 
    JOIN email_database ed ON ed.base_id = lm.base_id 
    GROUP BY l.id, ED.BASE_ID 
) A; 
Смежные вопросы